繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM