Kolmogorov-Smirnov 2样本测试Java给出0 p值

Kolmogorov-Smirnov 2样本测试Java给出0 p值,java,math,random,kolmogorov-smirnov,Java,Math,Random,Kolmogorov Smirnov,我使用Apache Commons数学Kolmogorov-Smirnov测试来确定我的RNG生成的样本是否是均匀分布 我正在使用UniformIntegerDistribution生成一个均匀分布,我得到了2000000个整数的样本。然后我将它们放入一个double[] 我也从我的2000000荷兰盾数字中生成,并将它们放入一个双[] 我已经绘制了样本图,我发现样本是均匀的,但K-S检验给我的p值为0.0,这表明从相同分布(即均匀分布)得出的两个样本的无效假设是无效的。这意味着我的RNG样本不

我使用Apache Commons数学Kolmogorov-Smirnov测试来确定我的RNG生成的样本是否是均匀分布

我正在使用
UniformIntegerDistribution
生成一个均匀分布,我得到了2000000个整数的样本。然后我将它们放入一个
double[]

我也从我的2000000荷兰盾数字中生成,并将它们放入一个
双[]

我已经绘制了样本图,我发现样本是均匀的,但K-S检验给我的p值为0.0,这表明从相同分布(即均匀分布)得出的两个样本的无效假设是无效的。这意味着我的RNG样本不符合均匀分布

double alpha=test.kolmogorovSmirnovTest(a,b)给我
alpha=0.0

该方法的Javadoc如下所示:

计算两样本Kolmogorov-Smirnov检验的p值或观察到的显著性水平,该检验评估x和y是来自相同概率分布的样本的无效假设

因此,我预计p值会很高,因为我看到的曲线图很明显是一致的

    IntegerDistribution uniform = new UniformIntegerDistribution(1, 81);

    ArrayList<Integer> lis = new ArrayList<>();
    int i = 0;
    while (i < 100000) {

        //Creates a list of 20 numbers ε [1,80]
        List<Integer> l = ls.createRandomNumbersInclusive(80, 20);
        lis.addAll(l);
        Assertions.assertFalse(l.stream().anyMatch(it -> it > 80));
        Assertions.assertFalse(l.stream().anyMatch(it -> it < 1));

        i++;
    }

    KolmogorovSmirnovTest test = new KolmogorovSmirnovTest();

    var sample = uniform.sample(2000000);

    List<Integer> ll = new ArrayList<>();
    double[] a = new double[2000000];

    for(var j = 0; j<2000000; j++) {
        a[j] = sample[j];
    }

    double[] b = lis.stream().map(it -> Double.valueOf(it)).mapToDouble(Double::doubleValue).toArray();

    var alpha = test.kolmogorovSmirnovTest(a, b); 

    System.out.println("Alpha "+ alpha); //This gives me 0.0

     /** I am doing the below to get the count per numbers [1,80] and plot them.
     * I see them being uniform 
     * 1 ===
     * 2 ===
     *  ...
     * 80 === 
     */
     Map<Integer, Long> result = lis.stream().collect(Collectors.groupingBy(it -> it, Collectors.counting()));

并且RNG是
RNG=SecureRandom.getInstance(“NativePRNGNonBlocking”)

我找到了问题背后的原因。我最初使用的
uniformrealdribution
kolmogorovSmirnovTest(再分配分布,双[]数据)

然而,出于某种原因,
均匀分布
包含但不包含

当我改变
IntegerDistribution uniform=new UniformIntegerDistribution(1,81)
整数分布均匀=新的均匀分布(1,80)
成功了

public List<Integer> fetchNumberList(final int drawNumberMin, final int drawNumberMax, final int drawNumberCount) {

    final List<Integer> range = new ArrayList<Integer>();
    for (int i = drawNumberMin; i <= drawNumberMax; i++) {
        range.add(i);
    }

    Collections.shuffle(range, rng);

    return new ArrayList<Integer>(range.subList(0, drawNumberCount));
}