我正在尝试模拟“三面骰子”以及连续3次获得相同数字的机会。我相信这个公式是这样的:(1/3)^ 3 我在java中做了以下几次尝试来模拟这个:
win = (int) (Math.random() * 3);
if (win != 1) {
n=0;
}
if (win == 1) {
n++;
}
if (n == 3) {
n=0;
l++;
}
y++;
所以l将是连续三次出现相同结果的次数。 y将是'roll'的总数。然而,我得到的结果并不倾向于(1/3)^ 3多次尝试。这是因为我只计算1连续出现而不是1 OR 2 OR 3连续出现3次?或者这里的错误是什么。感谢
答案 0 :(得分:1)
代码很清楚它在做什么。我建议像这样重组它
Random rand = new Random();
int attempts = 10000;
int allSame = 0;
for (int i = 0; i < attempts; i++) {
int a = rand.nextInt(3);
int b = rand.nextInt(3);
int c = rand.nextInt(3);
if (a == b && b == c)
allSame++;
}
System.out.println("The ratio was " + (double) allSame / attempts);
使用Java 8
IntSupplier dice = () -> rand.nextInt(3);
int allSame = IntStream.range(0, attempts)
.map(i -> dice.get())
.filter(d -> d == dice.get() && d == dice.get())
.count();
答案 1 :(得分:0)
我不确定您在代码中尝试了什么,但您的声明应该是(1/3)^3
不正确。
必须是(1/3)^2
,正如Peter Lawrey在评论中所说:
1/3
的可能性。 1/3
。 1/3 * 1/3
= 1/9
如果您这样想,您会得到相同的结果:
3^3
)。0-0-0
,
1-1-1
,2-2-2
)。3/27
= 1/9
您的代码确实令人困惑,因此我建议将其编写为不同的内容:
int lastNumber[2];
int winCount = 0;
for(n = 0; n< 1000; ++n){
int num = (int) (Math.random() * 3);
if(num == lastNumber[0] && lastNumber[0] == lastNumber[1] && n > 2){
++winCount;
}
lastNumber[0] = lastNumber[1];
lastNumber[1] = num;
}
system.println("Propability = " + (winCount*100)/1000.0f);
但请注意,如果你的骰子连续4次相同,则winCount会增加两倍。 (如果您不想要这种行为,请使用num=4;
)