[英]C++ Fill an array with random numbers without duplicates
我需要找到一种方法来用随机数填充数组而没有重复,所以我写了这段代码并且它有效。我的问题是,这段代码有效吗,它真的没有重复吗? 提前致谢!
#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 到 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';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.