-1

我对 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

对我来说看起来不是很随机......?

4

2 回答 2

2

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

于 2013-09-17T11:11:50.893 回答
2

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

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

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

并删除顶部的旧声明。

于 2013-09-17T12:04:15.773 回答