我希望能够生成介于0.0和1.0之间的随机值
我试过用
std::default_random_engine generator;
std::uniform_real_distribution<float> distribution(0.0, 1.0);
float myrand = distribution(generator);
在循环中生成随机值总是给我这些值:
0.000022
0.085032
0.601353
0.891611
0.967956
0.189690
0.514976
0.398008
0.262906
0.743512
0.089548
我能做些什么来真正获得随机值? 如果我总是得到相同的那些,那似乎不是随机的。
答案 0 :(得分:12)
// 1-st variant: using time() function for seed random distribution
std::default_random_engine generator(time(0));
std::uniform_real_distribution<double> distribution(first, last);
return distribution(generator);
/*disadvantages:
如果打开乘法程序使用相同的随机数发生器
它们将输出相同的结果,因为它们具有相同的种子值,即时间
使用随机设备解决了这个问题,请参阅以下说明:* /
// 2-nd variant:
std::uniform_real_distribution<double> distribution(first, last);
std::random_device rd;
std::default_random_engine generator( rd() );
return distribution(generator);
答案 1 :(得分:7)
如果您指的是每次执行程序都得到相同的结果,那是因为您需要根据某些自然随机的值(例如用户输入的某个数字或者数字)提供种子自计算机开启以来,或自1970年1月1日以来经过的毫秒数等):
#include <random>
std::default_random_engine generator;
generator.seed( /* ... */ );
// ^^^^^^^^^
// Provide some naturally random value here
std::uniform_real_distribution<float> distribution(0.0, 1.0);
float myrand = distribution(generator);
答案 2 :(得分:1)
我找到了另一个好的解决方案......
double Generate(const double from, const double to)
{
std::random_device rd;
return std::bind(
std::uniform_real_distribution<>{from, to},
std::default_random_engine{ rd() })();
}