如何为遗传算法生成随机数?

How should I generate random numbers for a genetic algorithm?

本文关键字:随机数 遗传算法      更新时间:2023-10-16

我正在写一个遗传算法来解决Master Mind游戏。我做了很多关于最佳方法的研究,拥有多样化的人口是非常重要的。我试图确定如何在c++中获得真正好的随机数。我在程序开始时使用srand(time(NULL))来设置种子,然后我简单地使用rand()。我想知道的是这到底有多随机?它很好吗?有没有其他更好的随机数库?

我知道数论和随机性是一门非常复杂的学科;在编写自己的rand()版本时,您有什么建议?

对于加密,您需要非常强的随机数属性。很多文献都集中在这类需求上。一个典型的解决方案是使用环境噪声(硬盘延迟、网络数据包、鼠标移动、RDRAND、HAVEGE等)播种SHA-256的迭代应用程序。

对于蒙特卡罗模拟或人工智能应用,随机性要求确实要低得多。事实上,非常简单的生成器就足够了。最基本的是臭名昭著的线性同余生成器,它现在被认为有点过时,因为输出模式有时会产生明显的和不必要的采样效果(特别是,在70年代和80年代进行的一些实验研究很可能因此而有缺陷)。如今,Mersenne Twister更受欢迎了,对于电脑游戏来说已经足够了。它在c++标准库中可用:参见std::mt19937。

rand()的随机性真的很差。这是一种标准的LCG,通常具有较差的随机性和较差的投影质量。如果你对应用程序的随机性质量很认真,你需要使用更好的东西。然后,这取决于您是否想要保持标准库。

如果你想使用标准库,使用<random> header和Mersenne Twister。

但是,我建议您使用PCG随机族代替。它速度快,质量好,修复了<random>的大部分错误。