如何测试浮点随机数生成器?

时间:2021-06-04 15:44:18

标签: java algorithm testing random

我为 128 位浮点运算编写了一个 Java class。在其他方法中,它有一种方法用于生成范围 [0, 1.0) 中的伪随机值。尽管我使用了我认为足够可靠的标准 java.util.Random 类,但我从中构造 Quadruple 类的值的方式可能会出错。所以我想确保它返回的随机值足够随机。我已经使用 卡方 标准检查了超过 10_000 个子范围的幅度分布,并检查了尾数每个位位置中 1 的频率,并且我已经查看了用肉眼对数字的十六进制表示,这就是我能想到的。到目前为止,一切看起来都很好。

但是这些测试不会检查伪随机数的许多其他可能的缺陷(例如,尾数位之间可能存在的相关性或简单地重复短值序列)。有没有什么方法可以更仔细、更全面地测试一系列这样的数字?如果它与问题相关,这种类型的数字的值在内部存储为 128 位(两个 long)尾数和 32 位指数。

1 个答案:

答案 0 :(得分:1)

当我处理自定义或自己的 PRNG 时,我总是这样做:

  1. 检查直方图

    这将确认随机性分布...所以只需为您的范围创建箱并计算 N 点中每个箱有多少 PRNG 数字,然后绘制结果

  2. 做一个“随机性”图

    简单地做一个二维点图,其中 x 轴是迭代(或订单号/索引),y 轴是 PRNG 值。像这样:

    for (x=0;x<100000;x++)
       {
       y=Random();
       RenderPixel(x*xscale,y*yscale,some_color);
       }
    

    这将生成图像,您可以很容易地在其中发现重复的模式(以防 PRNG 配置错误)。下面是来自 this answer 的简单无符号整数 PRNG 的示例:

    uint PRNG

您可以在计算基本统计属性的同时进行组合绘图,以检查 PRNG 的质量。这是我很久以前编写的一个古老的学校项目中的一个例子:

PRNG plots

绿色 点是“随机性”图,Aqua 是期望分布,黄色 是直方图。如果您在该动画 GIF 中看到大部分是白框,请下载并在图片查看器中查看(因为 Brownsers 最近添加了另一个 GIF 解码错误)