2017-05-24 9 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]); 
} 

、私はランダムに配列し、表示の3人の名前を選択する必要がありますそれらは画面に表示されます。どうやってやるの ?

PS:それに似た他の質問とは異なり、私はただ1語だけではなく、配列の完全な言葉を取ります。

+6

[0-5]の範囲の乱数を生成し、それを使用して名前を選択します。 –

+0

「1単語」と「1単語」の違いは何ですか? –

+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確かに、Weather Vaneが100回シャッフルするのはあまりにも多く、シャッフルは1回だけで十分だと示唆しています。カードデッキとディーラーを想像してみてください。デッキ全体を一度シャッフルしたと想像してください。あなたが不正行為に対して余分な妄想を抱えているので、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

同じ名前が2〜3回生成されることがあります。 –

+0

確かに、しかし問題では、重複を持たないように指定されていません。 – Vic

関連する問題