c – 比时间更好的种子(0)?

我明白,时间(0)通常用于播种随机数发生器,并且当程序每秒运行多次时,它只会成为问题.我想知道生成随机数时要考虑什么更好的种子.我在 Windows上阅读了关于GetTickCount,timeGetTime和Query PerformanceCounter.几乎所有操作都足够了,还是有更好的种子选择?

以下是使用boost库的快速代码示例:

#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.

资料来源:Wikipedia Globally Unique Identifier

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...