来自for循环的Math.random调用产生连续的“随机”数字

时间:2013-09-17 11:04:31

标签: java for-loop random

我对java的东西很新。目前我正在尝试编写处理生日问题的程序(维基百科)。我想知道有多少人被要求他们的出生日期和月份,直到一个人重复。 我写了一个类,用以下代码做“询问”:

    public class Starter {

    static ArrayList<Integer> peeps = new ArrayList<Integer>();
    static boolean match = false;
    static int counter = 0;

    public static int doRand() {
        int rand = (1 + (int) (Math.random() * ((365 - 1) + 1)));
        return rand;
    }

    public static int start() {

        do {
            int buffer = 0;
            buffer = doRand();
            if (peeps.isEmpty()) {
                peeps.add(doRand());
            }
            counter++;

            for (int i = 0; i < peeps.size(); i++) {

                if (peeps.get(i) == buffer) {
                    match = true;
                }
            }
            peeps.add(buffer);

        } while (match == false);

        return counter;
    }

}

这似乎有效,产生的数字有点在10到50之间。 但是,如果我从以下for循环中运行此函数,我会得到非常奇怪的结果:

    public class BirtdayProblem {

     public static void main(String[] args) {

        for (int i=0;i< 1000;i++) {

             System.out.println(Starter.start());
        }
     }
}

它产生1000个连续数字的输出......为什么? 如果我手动多次运行该功能,我从来没有得到任何连续的数字...... 有人可以向我解释一下吗?

示例输出: 25 26 27 ... ... 1016 1017 1018 1019 1020 1021 1022 1023 1024

看起来不是我的随从......?

2 个答案:

答案 0 :(得分:2)

Starter.start()返回静态“计数器”值,该值在for循环中每次迭代后递增1,因此输出以1为增量显示输出。

答案 1 :(得分:2)

您正在使用静态成员变量进行计数器和匹配。这意味着它们属于该类,并且不会在调用start()之间重置。

由于这些变量仅在start()方法中使用,我建议你也将它们的声明放在那里。

public static int start() {
  boolean match = false;
  int counter = 0;

删除顶部的旧声明。