Java 从for循环调用的Math.random生成连续的“随机”数
我对java很陌生。目前我正试图写一个程序来处理维基百科的生日问题。我想知道有多少人需要知道他们的出生日期和月份,直到有一个是重复的。 我编写了一个类,用以下代码进行提问: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 =
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这是正确的,我的意思是,这一观察结果才是解释错误的真正原因,可能对你当时的回答有用。我百分之百同意你。约翰尼,没错,我们同意。