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

前端之家收集整理的这篇文章主要介绍了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&C++相关文章