【问题标题】:Mersenne Twister: seeding & visualizationMersenne Twister:播种和可视化
【发布时间】:2010-12-19 17:05:07
【问题描述】:

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

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

以下是我尝试播种算法的几种方法:

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

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

【问题讨论】:

    标签: random visualization seeding mersenne-twister


    【解决方案1】:

    虽然我不能谈论您的第一点,但第二个问题与您如何计算要利用的点有关。具体来说,

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

    会给你一个“模式”,有点对应于你正在绘制的窗口的纵横比。例如,如果_canvasWidth_canvasHeight 相等,您将始终在一条对角线上绘图,因为xy 将始终相同。那么,这种图形表示在这种情况下不合适。

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

    1. 不要绘制它们(或将它们绘制到屏幕外)
    2. 执行线性插值以将位范围映射到窗口的宽度/高度

    任何一个选项都应该为您提供一个更具代表性的图片,说明您从随机数生成器中获得的位。祝你好运!

    【讨论】:

    • 感谢 fbrereto 的回答。您对相等宽度和高度的观察是非常正确的。我不知道我是怎么错过的 :) 这是我开始映射的方式: var x = (int)(number & 0xffff0000); var y = 数字 & 0x0000ffff; x = x % _canvasWidth; y = y % _canvasHeight;这在某种程度上类似于您的解决方案;但是,我认为 mod 功能仍然会扭曲结果。仅供参考,此映射导致垂直平行线!
    • 您需要将 x 值向下移动;在位掩码之后,它们将驻留在数字输出的高两个字节中,这些都是可能会扭曲您的 mod 的大数字。
    • 当您将结果绘制到屏幕上时,mod 可能总是会显示一些偏差。对于您正在尝试做的事情,我建议不要绘制大坐标(窗口外的坐标)或线性插值。
    • 我也完成了轮班;但坐标仍然远离可见区域。如果我们说生成的 int32 数字的左两个字节的平均值是 0x7FFF,它仍然远远超出我在 1280*1024 分辨率的显示器中所能显示的;因此是 mod。
    • 您应该将值从 rng 范围缩放到屏幕范围...这就是我所说的线性插值。这样每个值都有一个合理的屏幕像素位置。
    【解决方案2】:

    通过为每个 x 和 y 坐标生成一个新的随机数,您的条纹点绘图问题应该很容易解决。尝试为 x 和 y 重用单个生成的数字基本上是过早的优化,但如果你确实走这条路,请确保从数字中为每个提取不同的位;照原样,x=n%width;y=n%height 为您提供 x 和 y 之间的巨大相关性,如您的图片所示。

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

    【讨论】:

    • 使用两个数字进行绘图听起来像是解决我的第二个问题的方法,但出于某种原因,它让我感到内疚!我的意思是对用户,也许是审计员,每个点代表一个数字!以您在 MT 方面的经验,您通常如何播种?对 dieHard 有何评论?
    【解决方案3】:

    真随机数字生成不能用数学函数来完成。如果拥有真正的随机数很重要,请获取hardware random number generator。我开发了真钱在线扑克游戏——这样的硬件是确保数字没有规律的唯一方法。

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

    【讨论】:

    • 感谢您的回复。有很多在线游戏网站使用 Mersenne Twister 进行 RNG:practice.galewindsoftware.ca/demo/casino/help/certified/…pkr.com/en/support/licensing-and-integrity/monthly-certificates
    • -1:这是 FUD。 Mersenne twister 算法产生非常好的随机数。这是 Python 的默认随机数算法。虽然在技术上是伪随机的,但它有一个荒谬的重复周期——比可观测宇宙中的粒子数量还多。你的论点没有根据。
    • 你会在一个使用 Mersenne Twister 实现的二十一点网站上赌钱吗?一个实现是否可以被证明是正确和诚实的,这比仅仅插入一个随机数生成器要多得多。
    • 我不太确定二十一点和复杂的赌场游戏;但根据我在网上看到的情况,MT 可以为大多数在线游戏提供商提供服务。这是另一个示例:backgammonmasters.com/itechlabs/… 此外,iTechLab 在他们接受的算法之上展示了 MT:itechlabs.com.au/pages/rngtesting.html
    猜你喜欢
    • 2016-02-21
    • 2012-01-13
    • 2014-02-22
    • 2017-11-23
    • 2023-03-18
    • 2016-01-06
    • 1970-01-01
    • 2013-10-13
    • 2017-06-10
    相关资源
    最近更新 更多