我一直在尝试创建一个程序,它计算的概率2人的生日是相同的,考虑到有23人在房间里
我做过逻辑,但概率总是为零,应该在0.5以上,这是我的第一堂计算机科学课,所以我对Java和编码不是很熟悉。
我在网上看到一些程序有多个模拟,但我不能理解它。
import java.util.Random;
public class Main {
public static int rand_bd() {
Random rand = new Random();
int x = rand.nextInt(365);
return x;
}
public static void main(String[] args) {
System.out.println("Hello world!");
int h = 0;
double count = 0.0;
int g = rand_bd();
for(int i = 0;i <= 23;i++) {
h = rand_bd();
if(g == h)
count++;
}
System.out.println(count);
System.out.println(count/23.0);
System.out.println(rand_bd());
}
}
字符串
2条答案
按热度按时间exdqitrt1#
初步说明:
你似乎是在为每个随机值使用一个
Random
生成器对象(在你的rand_bd
方法中)。但这不是伪随机数生成的工作方式,所以你处于未经测试的环境中。库设计者唯一要测试的是 * 单个 *
Random
对象生成的序列是否具有正确的统计属性。因此,您应该修改代码以确保在整个模拟过程中使用单个Random
对象,通常通过将单个生成器对象(的地址)传递给rand_bd
。主要问题:
你似乎是在测试每个新的随机值是否与第一个随机值相等,但是,正如评论中提到的,这不是Birthday Paradox应该如何工作的。
每个新的伪随机值都必须测试是否与所有先前值相等。
为了测试所有先前的值,而不是编写低级Java代码,我们可以只维护和使用一个
HashSet<Integer>
对象,该对象包含所有先前找到的伪随机值。这可以用下面的代码来实现:
字符串
正如预期的那样,由上述代码生成的类文件在大约50%的时间内发现一个或多个冲突。
gcxthw6b2#
首先,让我重申jpmarinier的评论,你应该只创建一个
Random
对象。为每个要生成的值示例化一个新对象是昂贵的,它否定了PRNG创建者为确保值序列正确地模仿独立均匀分布的值所做的所有努力。接下来,我想你错过了生日问题的本质。它问的是在一个包含一定数量的人的集合中,有一个 * 或多个 * 重复生日的概率是多少。这是一个布尔选择,要么有重复的,要么没有。一旦你找到一个重复的,你可以缩短检查过程,因为目标不是计算发生了多少次。这很容易使用
Set
对象来完成,它不允许重复。最后,您忽略了Monte Carlo simulation的本质,即您需要重复随机实验。(重复/无重复),你可以通过运行大量的实验来更好地估计该事件的概率。很多很多。此外,由于重新运行随机实验会得到不同的结果,知道你所估计的任何东西的“误差幅度”是很好的。这以所谓的置信区间半宽的形式出现。
下面的代码将这些部分组合在一起:
字符串
并产生如下结果:
型
你可以清楚地看到,至少有一个重复生日的实验比例在23人中超过0.5。