我正在编写遗传算法来解决Master Mind游戏。我已经对最佳方法进行了大量研究,并且拥有多样化的人口非常重要。我试图确定如何在C ++中获得非常好的随机数。我已经在我的计划开始时srand(time(NULL))
设置了种子然后我只使用了rand()
。我想知道的是这是多么随机?它不错吗?是否还有其他更好的随机数库?
我知道数论和随机性是一个非常复杂的主题;您是否有任何关于编写自己的rand()
版本的指示?
答案 0 :(得分:5)
对于加密,您的随机数需要非常强大的属性。许多文献都集中在这些类型的要求上。一个典型的解决方案是使用环境噪声(硬盘延迟,网络数据包,鼠标移动,RDRAND,HAVEGE ......)播种SHA-256的迭代应用。
对于蒙特卡罗模拟或AI应用,随机性要求确实低得多。事实上,非常简单的发电机就足够了。最基本的是臭名昭着的线性同余发生器,现在被认为有点老式,因为输出模式有时会产生明显的和不需要的采样效果(特别是,在70年代和80年代进行的一些实验研究很可能是有缺陷的,因为这个)。如今,Mersenne Twister更受欢迎,并且足以用于电脑游戏。它可以在C ++标准库中找到:请参阅std::mt19937。
答案 1 :(得分:1)
rand()
的随机性非常糟糕。它是沼泽标准LCG,通常具有较差的随机性和较差的投影质量。如果您对应用程序的随机性质量非常认真,那么您需要更好地使用它。那么这取决于你是否想要保留标准库。
如果您想使用标准库,请使用<random>
标题和Mersenne Twister。
但是,我建议你改用the PCG random family。它速度快,质量好,可以解决<random>
的大多数错误。