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

How should I generate random numbers for a genetic algorithm?

我正在编写一个遗传算法来解决 Master Mind 游戏。我对最佳方法进行了大量研究,拥有多样化的人群非常重要。我正在尝试确定如何在 C++ 中获得真正好的随机数。我已经在我的程序开始时完成了 srand(time(NULL)) 来设置种子,然后我只使用了 rand()。我想知道的是,这到底有多随机?很好吗?还有其他更好的随机数库吗?

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

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

对于蒙特卡洛模拟或 AI 应用程序,随机性要求确实要低得多。事实上,非常简单的生成器就足够了。最基本的是臭名昭著的 Linear Congruential generator,它现在被认为有点过时,因为输出模式有时会产生明显的和不需要的采样效果(特别是,在 70 年代和 80 年代进行的一些实验研究很可能存在缺陷,因为这个)。如今,Mersenne Twister 更受欢迎,对于电脑游戏来说绰绰有余。它在 C++ 标准库中可用:请参阅 std::mt19937.

rand()的随机性真的很差。这是一个沼泽标准LCG,通常随机性差,投影质量差。如果您认真对待应用程序的随机性质量,则需要选择更好的东西。然后就看你要不要保留标准库了。

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

但是,我建议您改用 the PCG random family。它速度快,质量好,修复了 <random>.

的大部分错误