在C++中生成一个统一的随机整数

use*_*083 5 c++ random

问题是我需要生成0到999之间的随机整数(用于调查数学猜想).所有值都需要具有相同的概率.

我已经尝试了rand(),但是RAND_MAX在32767(在我的编译器上)这意味着只需rand() % 1000要将第一个1-767的线索更有可能出现(并且假设所有可能性rand()在第一个位置具有相同的概率).

我正在使用Windows所以/dev/random不是一个选择.

Joh*_*nic 19

您可以使用uniform_int_distributionC++ 11 执行类似的操作:

#include <iostream>
#include <random>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 999);

    for (int n=0; n<1000; ++n)
        std::cout << dis(gen) << ' ';
    std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)


Dre*_*ann 9

您的模数观察是正确的,并且是几个rand()不符合数学审查的原因之一.从这里的笔记:

无法保证产生的随机序列的质量.在过去,rand()的一些实现在所产生的序列的随机性,分布和周期中具有严重的缺点(在一个众所周知的示例中,低阶位简单地在调用之间在1和0之间交替).rand()不建议用于严重的随机数生成需求,如加密.

C++ 11引入了几个新的随机数生成器,这些生成器符合更严格的标准,可能适合您的目的.

如果你可以牺牲超过几个字节的开销(可以安全地假设你可以),我建议 std::mersenne_twister_engine