15

我希望能够生成 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

我该怎么做才能真正获得随机值?如果我总是得到相同的,似乎并不那么随机。

4

3 回答 3

21
// 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);

如果打开多个程序,使用相同的随机数生成器,它们都将输出相同的结果,因为它们具有相同的种子值,即时间。

这个问题通过使用随机设备解决,在下面的代码中:

// 2-nd variant: 
std::uniform_real_distribution<double> distribution(first, last);
std::random_device rd;
std::default_random_engine generator(rd());
return distribution(generator);
于 2013-03-17T13:24:09.400 回答
9

如果您指的是每次执行程序都会得到相同的结果,那是因为您需要基于一些自然随机值(例如用户输入的某个数字,或者自计算机已打开,或自 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);
于 2013-03-17T13:21:23.580 回答
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() })();
}
于 2015-05-30T15:14:38.010 回答