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

Java 如何测试浮点随机数生成器?,java,algorithm,testing,random,Java,Algorithm,Testing,Random,我已经为128位浮点算法编写了一个Java。在其他方法中,它具有一种旨在生成范围虽然我使用了标准代码> java .UTI.Auth.Read 类,我认为它足够可靠,但是我用它构造四倍类的值的方式可能会出错。所以我想确保它返回的随机值足够随机。我已经检查了10000个子范围内的大小分布。卡方标准,检查尾数每一位的1频率,我用肉眼观察了数字的十六进制表示,这就是我所能想到的。到目前为止,一切看起来都很好 但是这些测试并没有检查伪随机数的许多其他可能的缺陷(例如,尾数位之间可能存在的相关性,或者只是

我已经为128位浮点算法编写了一个
Java
。在其他方法中,它具有一种旨在生成范围
虽然我使用了标准<>代码> java .UTI.Auth.Read 类,我认为它足够可靠,但是我用它构造四倍类的值的方式可能会出错。所以我想确保它返回的随机值足够随机。我已经检查了10000个子范围内的大小分布。卡方标准,检查尾数每一位的
1
频率,我用肉眼观察了数字的十六进制表示,这就是我所能想到的。到目前为止,一切看起来都很好


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

在处理自定义或自有PRNG时,我总是这样做:

  • 检查直方图

    这将确认随机性分布…因此,只需为您的范围创建一个箱子,并计算N个点中每个箱子的PRNG编号,然后绘制结果

  • 绘制“随机性”图

    只需做一个二维点图,其中
    x
    轴是迭代(或订单号/索引),而
    y
    轴是PRNG值。如下所示:

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

    for(x=0;x参考文献可能会有帮助:。有PDF下载。@安迪谢谢,我会读的(如果对我来说不是太科学的话)至少它会为您提供一个全面的测试和描述列表。这将是一个基于其内容实现的很棒的Java库。该发行版似乎包括一个“c”实现。下面是一个同样用c实现的git项目: