我有一个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];
答案 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所说的内容。