std :: default_random_engine生成介于0.0和1.0之间的值

时间:2013-03-17 13:16:54

标签: c++ c++11 std

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

我能做些什么来真正获得随机值? 如果我总是得到相同的那些,那似乎不是随机的。

3 个答案:

答案 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() })();
}