c++ - 生成范围内的随机数,不重复

标签 c++ arrays matrix

我正在使用 C++ 生成给定范围内的 n 个统一数字,而不重复。我想将它保存在数组(而不是 vector )中。我找到了一个代码,但它不允许生成不重复的数字。

std::random_device rd;     // only used once to initialise (seed) engine
std::mt19937 rng(rd());    // random-number engine used (Mersenne-Twister in this case)

std::uniform_int_distribution<int> uni(0,10-1); // guaranteed unbiased
auto random_integer = uni(rng);

例如,我将生成 5 个 0-9 范围内的随机数,例如

1 0 3 8 6

这是我的代码

typedef unsigned int U32, *PU32;
U32 total_num = 5;
U32 *rndArray = new U32[total_num];
for (U32 i = 0; i < total_num; i++)
{
    std::random_device rd  // only used once to initialise (seed) engine
    std::mt19937 rng(rd());      
    std::uniform_int_distribution<int> uni(0,10-1);
    auto random_integer = uni(rng);
    rndArray[i] = random_integer ;
}

第二种方式,我使用了下面的代码,它允许不重复。但它在 g++ 中不支持(我在 ubuntu 中使用 g++)

#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
typedef unsigned int U32;
int main()
{        
    U32 total_num = 5;
    U32 *rndArray = new U32[total_num];
    std::random_device rd;
    std::mt19937 g(rd());
    std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::shuffle(v.begin(), v.end(), g);
    for (int i=0;i<5;i++)
    { 
        rndArray[i]=v[i];
        std::cout<< rndArray[i] << " ";
    }

    std::cout << "\n";
}

最佳答案

有几种方法可以做到这一点。

  1. 如果随机数已经在数组中,则生成另一个随机数,直到找到以前没有见过的数字。这实现起来很快,但缺点是理论上运行时间非常长。

  2. 首先在数组中创建整个范围,然后对其进行打乱。要获得 k 个数字,请获取扰乱数组的前 k 个元素。

关于c++ - 生成范围内的随机数,不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34477680/

相关文章:

opengl - 给定旋转后的法向量,求平面的 OpenGL 旋转矩阵

c++ - 将 void 函数转换为 char* C++

c++ - 信任注册表项或环境变量

python - 更改 numpy 数组的 dtype 会影​​响数据

javascript - 根据数组中的小时计算日期的出现次数

c++ - 为什么在将此二维数组传递给函数时出现错误?

algorithm - 矩阵算法的大 O 表示法

linux - 如何根据另一列过滤矩阵

c++ - 用于 C++ 分析的 Very sleepy 和 Callgrind 之间的区别

c++ - 如何向 GetFileName 添加扩展名?