Mersenne Twister:种子&可视化

时间:2009-11-24 00:23:25

标签: random visualization seeding mersenne-twister

我正在使用从CenterSpace下载的Mersenne Twister的C#实现。我有两个问题:

  1. 无论我如何为算法播种,它都不会通过DieHard tests,而且我的意思是我得到了很多1和0的p值。我的KStest在269个p值上也是0.嗯,我不能完全解释p值,但我认为结果中的一些1和0是坏消息。
  2. 我被要求直观地显示数字的随机性。因此,我在生成数字时绘制数字,这似乎并不是随机的。以下是结果after a few secondsa few seconds later的两个屏幕截图。正如您在第二个屏幕截图中看到的那样,数字落在某些平行线上。我尝试过不同的算法来将数字映射到点。它们都产生平行线,但角度不同!这就是我将数字映射到这些屏幕截图的点数的方法:new Point(number % _canvasWidth, number % _canvasHeight)。正如您可能猜到的,视觉效果取决于表单的宽度和高度,this is是一个灾难性的结果。
  3. 以下是我尝试种算算法的几种方法:

    1. 用户输入。我输入一些数字将算法作为一个int数组播种。
    2. 算法本身生成的随机数!!
    3. new Guid().GetHashCode()
    4. 的数组

      我在这里缺少什么?我应该如何种算算法?我怎样才能通过DieHard?

3 个答案:

答案 0 :(得分:3)

虽然我不能说到你的第一点,但第二个问题与你如何计算得分要点有关。具体地,

x = number % _canvasWidth;
y = number % _canvasHeight;

将为您提供一个“模式”,它与您要绘制的窗口的宽高比略有对应。例如,如果_canvasWidth_canvasHeight相等,则您将始终在单个对角线上绘制xy始终相同。在这种情况下,这种图形表示不合适。

如何获取RNG输出的N位并使用一半用于x坐标而另一半用于y坐标?对于那些超出窗口范围的位,您可能需要考虑两个选项:

  1. 不要绘制它们(或在屏幕外绘制)
  2. 执行线性插值以将位范围映射到窗口的宽度/高度
  3. 任何一个选项都可以为您提供更具代表性的图片,显示您获取随机数生成器的位数。祝你好运!

答案 1 :(得分:0)

通过为每个x和y坐标生成一个新的随机数,可以轻松修复条纹点绘图问题。尝试为x和y重复使用单个生成的数字基本上是过早的优化,但如果你确实沿着那条路线走下去,请确保从数字中提取不同的位;实际上,x=n%width;y=n%height为您提供了x和y之间的巨大相关性,如图像中所示。

我多年来一直在使用各种C ++ Mersenne Twister实现(最近boost)来生成random points并且没有遇到任何困难(种子相关或其他) 。它真的是一个极好的发电机。

答案 2 :(得分:-1)

使用数学函数无法生成真正的随机数字。如果拥有真正随机的数字很重要,请获得hardware random number generator。我开发了真钱在线扑克游戏 - 这种硬件是唯一可以确信数字没有模式的方式。

如果针对Linux环境,/dev/random and /dev/urandom pseudo devices比数学生成器好很多,因为它们包含代表硬件活动的随机数。