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

use*_*305 12 c++ std c++11

我希望能够生成介于0.0和1.0之间的随机值

我试过用

std::default_random_engine generator;
std::uniform_real_distribution<float> distribution(0.0, 1.0);

float myrand = distribution(generator);
Run Code Online (Sandbox Code Playgroud)

在循环中生成随机值总是给我这些值:

0.000022

0.085032

0.601353

0.891611

0.967956

0.189690

0.514976

0.398008

0.262906

0.743512

0.089548
Run Code Online (Sandbox Code Playgroud)

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

spi*_*ght 13

// 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:   
Run Code Online (Sandbox Code Playgroud)

如果使用相同随机数生成器的open multiply程序,
它们将输出相同的结果,因为它们具有相同的种子值,即时间.
使用随机设备解决了这个问题,请参阅以下说明:*/

// 2-nd variant: 
std::uniform_real_distribution<double> distribution(first, last);
 std::random_device rd;
 std::default_random_engine generator( rd() );
 return distribution(generator);
Run Code Online (Sandbox Code Playgroud)


And*_*owl 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);
Run Code Online (Sandbox Code Playgroud)