Java 从for循环调用的Math.random生成连续的“随机”数

Java 从for循环调用的Math.random生成连续的“随机”数,java,for-loop,random,Java,For Loop,Random,我对java很陌生。目前我正试图写一个程序来处理维基百科的生日问题。我想知道有多少人需要知道他们的出生日期和月份,直到有一个是重复的。 我编写了一个类,用以下代码进行提问: public class Starter { static ArrayList<Integer> peeps = new ArrayList<Integer>(); static boolean match = false; static int counter =

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


我看不出任何形式的随机性…?

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

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

因为这些变量只在start方法中使用,所以我建议您也将它们的声明放在那里

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

并删除顶部的旧声明。

在询问StackOverflow之前,您应该通过调试器运行此操作,并将其减少到最小的可重复问题。一旦你这样做了,问题就显而易见了,这是因为你的随机数在第一次运行后对方法调用的结果没有影响。365-1+1是一个有趣的表达式,顺便说一句:有点,但这并不能解释为什么计数器在方法内的循环中只更新一次。问题是,比赛再也不会是假的了。为什么比赛又会是假的呢?我看不出有哪一行会将匹配设置为false。如果希望match为false,则应在匹配的开始或结束时将其设置为falsemethod@SeanOwen:计数器在do中始终递增1..while for every for loop迭代作为匹配变量,不再为false。@jay这是正确的,我的意思是,这一观察结果才是解释错误的真正原因,可能对你当时的回答有用。我百分之百同意你。约翰尼,没错,我们同意。