我明白,时间(0)通常用于播种随机数发生器,并且当程序每秒运行多次时,它只会成为问题.我想知道生成随机数时要考虑什么更好的种子.我在
Windows上阅读了关于GetTickCount,timeGetTime和Query
PerformanceCounter.几乎所有操作都足够了,还是有更好的种子选择?
#include <iostream> #include <boost/random.hpp> using namespace std; using namespace boost; int main() { mt19937 randGen(42); uniform_int<> range(0,100); variate_generator<mt19937&,uniform_int<> > GetRand(randGen,range); for (int i = 0; i < 30; ++i) cout << GetRand() << endl; }
解决方法
Netscape安全性的一些早期攻势集中在知道何时发送加密数据包,并缩小可能范围的种子的知识.所以,得到一个滴答计数或其他甚至远程确定性不是你最好的赌注.
即使使用种子,根据该种子,“随机”数的序列是确定性的.内华达州的游戏委员会调查员意识到这一点,他应该检查一些插槽,并使用这些知识赚取相当多的钱,才被抓住.
如果您需要世界级的随机性,您可以向您的系统添加硬件,提供高度随机的数字.这就是众所周知的扑克网站(至少这就是他们所说的话).
结合您的系统的一些因素,所有这些因素都可以独立快速地变化,尽可能少的可预测性,创造出非常体面的种子.对SO的相关文章的回答建议使用Guid.NewGuid().GetHashCode().由于Guid是基于一些确定性因素,包括时间,这不是种子的良好基础:
Cryptanalysis of the WinAPI GUID
generator shows that,since the
sequence of V4 GUIDs is pseudo-random,
given the initial state one can
predict up to the next 250 000 GUIDs
returned by the function
UuidCreate[2]. This is why GUIDs
should not be used in cryptography,
e.g.,as random keys.