在较小的时间间隔内生成大量随机数(c ++)

时间:2014-01-11 22:37:40

标签: c++ random

我有一个for循环,在其中我生成随机数并用time(msecs)播种它,但它不是随机生成的,我能做些什么来解决这个问题?

请注意: 我知道为什么rand()不会随机生成它们,我正在寻求解决方案,如果有帮助我会使用Qt创建器。

for(int j=0;j<5;j++){
       qsrand(QDateTime::currentDateTime().time().msec());//for every j itteratio i must
       for(int i=1;i<s;i++){                              //have new sequence and ret is 
        ret.push_back(rand()%s);                          //vector i'm using Qt 
        }                                                 //s=4 for now,but s=[1;50]
      qDebug()<<"new sequence ...";
    }

它生成 [2,1,1],[2,1,1],[2,1,1],[2,1,1],[2,1,1];

2 个答案:

答案 0 :(得分:0)

取决于你的申请是什么。 如果您需要生成无法猜到的安全随机数,那么您应该使用CSPRNG https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator。 对于这个purpouse,unix克隆可以使用/ dev / urandom。

如果您需要随机数字进行模拟或类似的需要随机数字的地方,您应该使用高质量的超快速,随机和大型PRNG,称为mersenne twister。 它可以在c ++ 11的标准库中或在boost中使用。 (仅限标题)
http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
http://www.boost.org/doc/libs/1_55_0/doc/html/boost_random.html

正如许多其他人所说,确保你只种一次种子。

答案 1 :(得分:0)

如果你想要一个很长的随机数序列,就像这里一样,你可能想要使用伪随机数生成器(除非这是用于加密!)。 C ++ 11将随机和伪随机数支持到标准库中,这使得它非常易于使用。只需在循环之前用一个真正的随机数为PRNG播种,然后只使用其中的输出来获得(伪)随机数。您还需要包含random标题。

std::random_device rd;
std::default_random_engine e1{rd()};
std::cout << e1(); // random number
std::cout << e1(); // another random number

std::uniform_int_distribution<> dist{1, 6};
std::cout << dist(e1); // random integer between 1 and 6

如果这是用于密码学的,请参阅Luka Rahne所说的内容。