如何从C中随机选取数组中的元素?

时间:2017-05-24 17:12:07

标签: c arrays random

我有一个包含6行和20列的数组:

char name[6][20];

我使用names输入for

puts("Enter with 6 names :");

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

之后,我需要随机选择数组的三个名称并在屏幕上显示它们。我怎么能这样做?

PS:与其他类似的问题不同,我不想只拿一个单词,而是整个数组。

2 个答案:

答案 0 :(得分: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个随机不重复的名称。

答案 1 :(得分: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;   
}