生成随机数而不重复。我的逻辑是否正确?

时间:2015-12-04 22:53:19

标签: c arrays random srand

我编写了以下代码,我命令从给定的单词数组中随机选择一个单词而不选择相同的单词两次。 (我只想选择4个单词)。干运行程序并对其进行测试后,一切似乎都很有趣,并且没有遇到重复,但是我想进行第二次验证,因为我不熟悉编程。

char words[10][10] = {"dog", "cat", "horse", "cow", "goat", "monkey", "elephant", "crow", "fish", "snake"};

void getRandomWords()
{
    int i = 0, k = 0;

    srand((unsigned)time(NULL));
    n = rand() % 10;
    checkRandom[k] = n;
    k ++;

    for (int j = 0; j < 10; j ++) {
        printf("%c\n", words[n][j]);
    }

    do {
        n = rand() % 10;

        for (int t = 0; t < 4; t ++) {
            if (checkRandom[t] == n) {
                found = 1;
                break;
            }
            else
                found = 0;
        }

        if (found == 0) {
            checkRandom[k] = n;
            k ++;
            for (int j = 0; j < 10; j ++) {
                printf("%c\n", words[n][j]);
            }
            i++;
        }
    } while (i < 3);
}

1 个答案:

答案 0 :(得分:1)

您可以使用Fisher-Yates shuffle算法的变体快速生成无重复的随机排序序列。 “由内而外”算法的略微简化版本是:

void shuffle(int *array, int length) {
    int i, value;

    array[0] = 0;

    for (i = 1 ; i < length ; i++) {
        value = rand() % (i + 1);

        array[i] = array[value];
        array[value] = i;
    }
}

你可以做类似的事情来生成一个随机的整数数组,然后用这些整数来索引你的单词数组。