我对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
看起来不是我的随从......?
答案 0 :(得分:2)
Starter.start()返回静态“计数器”值,该值在for循环中每次迭代后递增1,因此输出以1为增量显示输出。
答案 1 :(得分:2)
您正在使用静态成员变量进行计数器和匹配。这意味着它们属于该类,并且不会在调用start()之间重置。
由于这些变量仅在start()方法中使用,我建议你也将它们的声明放在那里。
public static int start() {
boolean match = false;
int counter = 0;
删除顶部的旧声明。