【问题标题】:How should I generate random numbers for a genetic algorithm? [closed]我应该如何为遗传算法生成随机数? [关闭]
【发布时间】:2015-08-03 11:18:45
【问题描述】:

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

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

【问题讨论】:

  • 如果你有 C++11,请使用this
  • 对于遗传算法,你不需要非常好的随机数,std::mt19937 就可以了。
  • 查看其中一项是否符合您的需求:en.cppreference.com/w/cpp/numeric/random
  • 如果你有 C++11,你应该使用std::mt19937 并且可能使用std::uniform_xxx_distribution。如果你没有 C++11,你应该得到它。
  • 哦,哇,我不知道所有这些都存在于 C++11 中!我得检查一下,但我想我有。那些将是完美的!

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


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!这很有启发性
【解决方案2】:

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

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

但是,我建议您改用the PCG random family。速度快,质量好,修复了<random>的大部分错误。

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 2010-11-05
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多