2

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

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

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

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

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

4

3 回答 3

3

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

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

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

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

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

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

于 2009-11-24T00:42:33.077 回答
0

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

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

于 2009-11-24T00:59:14.000 回答
-1

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

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

于 2009-11-24T00:44:32.643 回答