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

时间:2015-05-21 16:42:26

标签: c++ random genetic-algorithm number-theory

我正在编写遗传算法来解决Master Mind游戏。我已经对最佳方法进行了大量研究,并且拥有多样化的人口非常重要。我试图确定如何在C ++中获得非常好的随机数。我已经在我的计划开始时srand(time(NULL))设置了种子然后我只使用了rand()。我想知道的是这是多么随机?它不错吗?是否还有其他更好的随机数库?

我知道数论和随机性是一个非常复杂的主题;您是否有任何关于编写自己的rand()版本的指示?

2 个答案:

答案 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>的大多数错误。