C ++用随机数填充数组而不重复

时间:2020-03-17 15:45:41

标签: c++

我需要找到一种方法来用随机数填充数组而不重复,所以我编写了这段代码,它可以工作。我的问题是,这段代码是否有效,是否真的没有重复?预先感谢!

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

int main(void) {
    srand(time(NULL));
    std::size_t array_size=100;
    int array[array_size];
    for(int i=0;i<array_size;i++) {
        array[i]=rand()%105+1;
            for(int k=0;k<array_size;k++) {         // Checks if there is a duplicate in the array //
                    if(i!=k) {                      // Don't check for the same array position //
                        if(array[i]==array[k]) {    // If a duplicate is found,repeat the check process//
                        array[i]=rand()%105+1;
                        k=-1;                       // -1 so the for loop starts from zero //
                }
            }
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:6)

当期望值的数量远小于可能值的数量时,该方法效果很好。大多数情况下,它不会产生重复的值,因此只会保留它产生的值。但是,当没有太多的懈怠时,就会有很多重复项。当此代码接近尾声时,当只有六个或七个左右的可接受值时,它将生成一个介于1和106之间的值。因此,它最终使车轮旋转。

创建一个包含所有可能值的数组,而不是执行所有循环,随机地将其洗牌,然后丢弃多余的值:

int array[105];
for (int i = 0; i < 105; ++i)
    array[i] = i + 1;
std::mt19937_64 mt;
std::shuffle(std::begin(array), std::end(array), mt);
for (int i = 0; i < 100; ++i)
    std::cout << array[i] << '\n';