我正在使用我从中下载的Mersenne Twister的C# 中心空间. 。我有两个问题:

  1. 无论我如何播种算法,都不会通过 顽固的测试, ,我的意思是我得到了很多1秒和0s的p值。另外,我在269 p值的KSTest是0。嗯,我不能完全解释p值,但是我认为结果有几个1和0是个坏消息。
  2. 我被要求以视觉显示数字的随机性。因此,我绘制数字生成的数字,这似乎根本不是随机的。这是结果的两个屏幕截图 几秒钟后几秒钟后. 。正如您在第二个屏幕截图中看到的那样,数字落在某些平行线上。我尝试了不同的算法将数字映射到点。它们都导致平行线,但具有不同的角度!这就是我将数字映射到这些屏幕截图的点: new Point(number % _canvasWidth, number % _canvasHeight). 。您可能猜到,视觉结果取决于表单的宽度和高度,以及 这是 灾难性的结果。

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

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

我在这里想念什么?我应该如何播种算法?我该如何让它通过顽固的?

有帮助吗?

解决方案

虽然我无法说出您的第一点,但第二个问题与您如何计算要借鉴的要点有关。具体来说,

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

将为您提供一个与您要绘制的窗口的长宽比相对应的“模式”。例如,如果 _canvasWidth_canvasHeight 相等,您总是会在一条对角线上绘制 xy 总是一样。在这种情况下,此图形表示不合适。

如何将RNG输出的n位并使用一半作为X坐标,而另一半则用于Y坐标?对于那些从窗口界限中脱落的部分,您可能需要考虑两个选择:

  1. 不要画它们(或从屏幕上画出)
  2. 执行线性插值以将钻头的范围映射到窗户的宽度/高度

任何一种选项都应该为您提供更具代表性的图片,以了解您的随机数生成器的位置。祝你好运!

其他提示

您的条纹点绘制问题应通过为X和Y坐标中的每个坐标生成新的随机数来轻松解决。试图重复使用X和Y的单个生成的数字基本上是过早的优化,但是如果您确实走了那条路线,请确保从数字中提取不同的位;原来 x=n%width;y=n%height 如图像中可以看到的那样,给您X和Y之间的巨大相关性。

多年来,我一直在使用各种C ++ Mersenne Twister实现(最近 促进's)生成 随机的 并且没有困难(种子相关或其他)。它确实是一个出色的发电机。

真随机 数学函数无法完成数字生成。如果真正的随机数很重要,请获得 硬件随机数生成器. 。我已经开发了真实的在线扑克游戏 - 硬件是确信数字中没有模式的唯一方法。

如果针对Linux环境,则 /dev/andan和/dev/urandom伪设备 比数学发生器要好得多,因为它们合并了代表硬件活动的随机数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top