我似乎看到很多答案,有人建议使用它<random>来生成随机数,通常伴随着这样的代码:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 5);
dis(gen);
Run Code Online (Sandbox Code Playgroud)
通常这会取代某种"邪恶的憎恶",例如:
srand(time(NULL));
rand()%6;
Run Code Online (Sandbox Code Playgroud)
我们可能会批评旧的方式,认为time(NULL)提供低熵,time(NULL)可预测,最终结果是不均匀的.
但所有这一切都适用于新的方式:它只有一个更光亮的贴面.
rd()返回一个unsigned int.这至少有16位,可能是32位.这还不足以为MT的19937位状态提供种子.
使用std::mt19937 gen(rd());gen()(以32位播种并查看第一个输出)不能提供良好的输出分布.7和13永远不会是第一个输出.两粒种子产生0.十二粒种子产生1226181350.(链接)
std::random_device可以(有时是)实现为具有固定种子的简单PRNG.因此,它可能在每次运行时产生相同的序列.(链接)这甚至比time(NULL).
更糟糕的是,尽管存在它们包含的问题,但复制和粘贴上述代码片段非常容易.对此的一些解决方案需要获得可能不适合每个人的大型 库.
鉴于此,我的问题是如何在C++中简洁,便携,彻底地播种mt19937 PRNG?
鉴于上述问题,一个很好的答案:
std::random_device或time(NULL)作为熵的来源.思考
可能重复:
从范围生成随机整数
我正在尝试创建一个程序,其中计算机猜测用户在他/她心中的数字.唯一需要的用户输入是猜测是否过高,过低或正确.我在根据先前的猜测存储最小值和最大值的两个变量之间生成随机数时遇到问题.这是我的代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(static_cast <unsigned int> (time(0)));
int compGuess = rand() % 100 +1; //Generates number between 1 - 100
int highestNumber = 100;
int lowestNumber = 1;
char ready;
char highLowSuccess;
bool success;
int tries = 0;
cout << "Please pick a number between 1 - 100. I will guess your number. Don't tell me what it is!\n\n";
do
{
cout << "Are you ready? (y/n)\n\n";
cin …Run Code Online (Sandbox Code Playgroud) 我将随机数生成器应用于我的代码,尽管当我第二次或第三次运行代码时,生成的第一个数字没有改变。然而,其他数字发生了变化,问题仅在于第一个值。我正在使用代码块;Cygwin GCC 编译器 (c++ 17)。利用时间播种。
#include <iostream>
#include <random>
#include <ctime>
int main()
{
std::default_random_engine randomGenerator(time(0));
std::uniform_int_distribution randomNumber(1, 20);
int a, b, c;
a = randomNumber(randomGenerator);
b = randomNumber(randomGenerator);
c = randomNumber(randomGenerator);
std::cout<<a<<std::endl;
std::cout<<b<<std::endl;
std::cout<<c<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当我第一次运行代码时,它可能会产生类似 a = 4、b = 5、c = 9 的结果。第二次和以后的时间 (a) 仍为 4,但 (b) 和 (c) 不断变化。