2017-05-24 365 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

相关问题