【问题标题】:How to make a randomness checker more efficient如何使随机性检查器更有效
【发布时间】:2017-01-27 16:37:41
【问题描述】:

您好,我正在尝试编写一个程序来检查 Java 中随机数的分布。 该程序的想法是(使用Java)生成许多随机数,然后查看以下每个范围内有多少个数字:

  • 0.0 - 0.1
  • 0.1 - 0.2
  • 0.2 - 0.3

    ...

  • 0.8 - 0.9

  • 0.9 - 1.0

我已经设法做到了,但我想知道是否有更有效/更快的方法来做到这一点。

public class RandomTest
{
    //Get value of digit in tenths place of double
    public static int getFirstDecimal(double num) 
    {
        return (int) (num * 10);
    }

    public static void main(String args[])
    {
        int[] results = new int[10]; //Results array

        double x; //Random number holder
        int genNum; //Number of random numbers to generate

        for(genNum = 0; genNum < 10000; genNum++)
        {
            x = Math.random();
            results[getFirstDecimal(x)]++;
        }

        for(int i = 0; i < 10; i++)
        {
            System.out.println(results[i]);
        }
    }
}

【问题讨论】:

  • 由于getFirstDecimal() 非常简单,而且您只需从一行代码中调用它,因此内联它可能会更有效。
  • 除此之外,我看不出哪里有很大的空间可以删减任何内容,或者您​​在哪里做的工作超出了需要。
  • 你如何判断这些数字是否随机?

标签: java algorithm optimization random


【解决方案1】:

如果你真的想缩短代码试试这个:

int[] results = new int[10];
IntStream.range(1, 10000).forEach(s -> results[getFirstDecimal(Math.random())]++);
Arrays.stream(results).forEach(System.out::println);

从 1 到 10000 的 IntStream 就像一个 for 循环,对于这些数字中的每一个,您都执行相同的操作,在数组中的相应索引处递增值。然后你只需打印该数组,也使用流。当然你需要保留你的getFirstDecimal方法,因为这段代码在里面使用了这个方法,你可以从那个方法中提取代码到流中,但是看起来很难看,我认为最好有一个单独的方法。

【讨论】:

  • OP 询问的是 faster 代码,而不是 shorter 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多