2017-05-24 362 views
-1

我有6行20列的排列:如何從C中的數組中隨機選取元素?

char name[6][20]; 

我進入namesfor

puts("Enter with 6 names :"); 

for(i=0; i< 6 ; i++) 
{ 
    scanf("%19[^\n]%*c",name[i]); 
} 

在那之後,我需要隨機選擇的排列顯示的三個名字他們在屏幕上。我怎樣才能做到這一點 ?

PS:與其他類似的問題不同,我不想只取一個單詞,而是整個單詞。

+6

在範圍[0-5]中生成一個隨機數,並用它來選擇名稱... –

+0

「只是一個單詞」和「完整單詞」有什麼區別? –

+0

@ScottHunter嘿,你不會問「一次性工作」和「全職工作」嗎? :) –

回答

1

這裏是一個可能的解決您的問題,假設你存儲名稱數組,只需創建位置的數組,然後將它洗幾次這樣的位置是隨機的,最後挑3個位置(例如,前3個):

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define ROWS 6 
#define COL 20 
#define RND_NAMES 3 

void shuffle(int *array, int n, int num_shuffles) { 
    srand((unsigned)time(NULL)); 
    for (int j = 0; j < num_shuffles; j++) { 
     for (int i = 0; i < n - 1; i++) { 
      size_t j = i + rand()/(RAND_MAX/(n - i) + 1); 
      int t = array[j]; 
      array[j] = array[i]; 
      array[i] = t; 
     } 
    } 
} 

int main() { 
    int i; 
    char name[ROWS][COL] = {"name1", "name2", "name3", 
          "name4", "name5", "name6"}; 
    int positions[ROWS] = {0, 1, 2, 3, 4, 5}; 
    shuffle(positions, ROWS, 100); 

    printf("%s\n", name[positions[0]]); 
    printf("%s\n", name[positions[1]]); 
    printf("%s\n", name[positions[2]]); 

    return 0; 
} 

用這種方法,你可以保證拿起3個隨機不重複的名字。

+0

感謝您的代碼,它令人驚歎。我是C新手,我不知道這個洗牌正在做什麼,爲什麼有100個?你能向我解釋一下嗎? – Mondial

+0

功能洗牌的位置 - 100倍,這可能是矯枉過正,也許一次就足夠了。 –

+0

@Mondial當然,由於天氣風向標建議可能洗牌100次太多,洗牌只有一次就夠了。想象一下卡牌和一個經銷商,現在......想象一下他整個甲板上都洗牌了......而且你要求他再洗牌99次,因爲你對作弊更加偏執,這裏是一樣的:) – BPL

0

在這裏,我寫了一個簡單的解決方案,爲你想要實現的。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define ROWS  6 
#define COL  20 
#define RND_NAMES 3 

int main() 
{ 
    int i; 
    char name[ROWS][COL]; 

    // init pseudo-random number generator 
    srand((unsigned)time(NULL)); 

    puts("Enter with 6 names: "); 

    for (i=0; i < ROWS; i++) { 
     scanf("%19[^\n]%*c", name[i]); 
    } 

    puts("Random names: "); 

    for (i=0; i < RND_NAMES; i++) { 
     printf("%s\n", name[rand() % ROWS]); 
    } 

    return 0; 
} 
+0

這可能會產生兩到三次相同的名稱。 –

+0

確實,但在問題中,沒有指定不重複。 – Vic

相關問題