【问题标题】:How can I test a floating-point random number generator?如何测试浮点随机数生成器?
【发布时间】:2021-06-04 15:44:18
【问题描述】:

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

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

【问题讨论】:

标签: java algorithm testing random


【解决方案1】:

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

  1. 检查直方图

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

  2. 做一个“随机”图

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-01-03
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多