【问题标题】:Optimal constant seed for Mersenne Twister in C++ 11C++ 11 中 Mersenne Twister 的最佳常量种子
【发布时间】:2017-08-20 11:28:26
【问题描述】:

我的用例是:我需要随机数,但仅用于图形(不适用于密码学)。我需要能够为 2 次渲染/运行获得相同的图像(结果)。例如,使用time() 作为种子不会为下一次运行创建相同的结果。所以我需要一个常量种子。

Mersenne Twister 的文档说它不喜欢 0 作为种子,它也不喜欢某些位组合。对于这种情况,据说它最多需要 800000 次调用,直到它再次提供好的随机数。出于速度原因,我不想花费 800000 次通话的开销。 理想情况下,我需要一些可以直接用作种子的不错且值得信赖的值。

【问题讨论】:

  • 你试过4吗?
  • 测试时真的需要真正随机的结果吗?
  • 为什么两次运行需要相同的结果?如果答案是“可重复性”,那么您应该从标准来源(如时间戳)获取种子并记录它,并使其可选地作为命令行参数覆盖。这是例如使用的方法。 gtest.
  • 嗨 Nir,我根据“随机”位置发射粒子。我需要相同的结果,否则我会得到动画闪烁(粒子会从图像改变位置到下一个图像)。想象一个相机飞过。我还将检查使用 3d 位置作为种子,因为这看起来更稳定。最后但并非最不重要的一点是,当场景中的对象也被动画化时,它是最佳支持。如果障碍物移动,并且我的粒子被阻挡,那么稍后拍摄的所有粒子都会脱轨(闪烁)。我很可能会预先计算随机数序列以防止这种情况发生。

标签: c++ c++11 random random-seed mersenne-twister


【解决方案1】:

只要选择你想要的任何数字。

您必须牢记的是,密码学专家和算法分析师用于“高质量随机性”的标准几乎肯定远高于您的项目所需的标准,尤其是对于像 Mersenne 这样经过良好测试的算法捻线机。这些标准中的大多数都是为错误测试场景或统计分析而设计的,其中“低于标准质量”的随机数序列可能会错过重要的测试用例,或者数字可能会扭曲预期的均值/中值/标准偏差结果。

这些问题极不可能是您的应用程序中的问题。

【讨论】:

  • 我尝试将 0、4 和 2384572893 作为种子。结果看起来非常相似。我确实看到了一些带有 0 的结构,它会随着 4 和 2384572893 而消失,但这可能是纯粹的机会。
  • Mersenne Twister 在其状态数组中的所有元素都为零时出现问题——这与您传递给seed 或构造函数的数字或序列不同。使用一种算法将熵从种子值传播到状态数组中,从而避免退化情况。所以这个答案是对的,随便选一个数字就行了。
猜你喜欢
  • 2016-01-06
  • 2017-06-10
  • 2014-02-22
  • 2016-02-21
  • 2010-12-19
  • 2013-10-13
  • 2012-01-13
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多