我需要找到一种方法来用随机数填充数组而不重复,所以我编写了这段代码,它可以工作。我的问题是,这段代码是否有效,是否真的没有重复?预先感谢!
#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;
}
答案 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';