java:生日概率程序
java: Birthday probability program
我正在尝试创建一个程序来计算一个房间里随机出现的两名学生生日相同的概率。输入学生人数和模拟次数。但是,每当我 运行 它时,有 23 个学生,我总是得到 0.69,这与大约 0.50 的实际答案不一致。我认为这可能与以下事实有关:如果有 3 名学生生日相同,则将其视为 3 场比赛。但我不确定如何解决这个问题,我已经尝试了多次。我能得到一些帮助吗?
import java.util.Scanner;
public class bday{
public static void main(String[] args){
Scanner inp = new Scanner(System.in);
System.out.println("How many students?");
int num = inp.nextInt();
System.out.println("How many times?");
int times = inp.nextInt();
double x[] = new double[num];
int match = 0;
for(int i=0;i<times;i++){
for(int j=0;j<num;j++){
x[j] = (int)(Math.random()*365)+1;
}
for(int j=0;j<num;j++){
for(int k=j+1;k<num;k++){
if(x[j]==x[k]){
match++;
}
}
}
}
double prob = (double)match/times;
System.out.println("The probability for two students to share a birthday is "+prob+".");
}}
你搞砸了逻辑。逻辑应该是这样的:
每当出现同一生日时,您将一个添加到总匹配项中,然后中断然后重新开始。完成所有次数后,将总匹配次数除以次数。
这是代码:
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner inp = new Scanner(System. in );
System.out.println("How many students?");
int num = inp.nextInt();
System.out.println("How many times?");
int times = inp.nextInt();
int x[] = new int[num];
int matches = 0;
boolean out = false;
for (int i = 0; i < times; i++) {
for (int j = 0; j < num; j++) {
x[j] = (int)(Math.random() * 365) + 1;
}
for (int j = 0; j < num; j++) {
for (int k = j + 1; k < num; k++) {
if (x[j] == x[k]) {
matches++;
out = true;
break;
}
}
if (out) {
out = false;
break;
}
}
}
double prob = (double) matches / times;
System.out.println("The probability for two students to share a birthday is " + prob + ".");
}
}
测试结果:100000为0.50557,1000000为0.507591,应该接近你的答案。
我正在尝试创建一个程序来计算一个房间里随机出现的两名学生生日相同的概率。输入学生人数和模拟次数。但是,每当我 运行 它时,有 23 个学生,我总是得到 0.69,这与大约 0.50 的实际答案不一致。我认为这可能与以下事实有关:如果有 3 名学生生日相同,则将其视为 3 场比赛。但我不确定如何解决这个问题,我已经尝试了多次。我能得到一些帮助吗?
import java.util.Scanner;
public class bday{
public static void main(String[] args){
Scanner inp = new Scanner(System.in);
System.out.println("How many students?");
int num = inp.nextInt();
System.out.println("How many times?");
int times = inp.nextInt();
double x[] = new double[num];
int match = 0;
for(int i=0;i<times;i++){
for(int j=0;j<num;j++){
x[j] = (int)(Math.random()*365)+1;
}
for(int j=0;j<num;j++){
for(int k=j+1;k<num;k++){
if(x[j]==x[k]){
match++;
}
}
}
}
double prob = (double)match/times;
System.out.println("The probability for two students to share a birthday is "+prob+".");
}}
你搞砸了逻辑。逻辑应该是这样的: 每当出现同一生日时,您将一个添加到总匹配项中,然后中断然后重新开始。完成所有次数后,将总匹配次数除以次数。 这是代码:
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner inp = new Scanner(System. in );
System.out.println("How many students?");
int num = inp.nextInt();
System.out.println("How many times?");
int times = inp.nextInt();
int x[] = new int[num];
int matches = 0;
boolean out = false;
for (int i = 0; i < times; i++) {
for (int j = 0; j < num; j++) {
x[j] = (int)(Math.random() * 365) + 1;
}
for (int j = 0; j < num; j++) {
for (int k = j + 1; k < num; k++) {
if (x[j] == x[k]) {
matches++;
out = true;
break;
}
}
if (out) {
out = false;
break;
}
}
}
double prob = (double) matches / times;
System.out.println("The probability for two students to share a birthday is " + prob + ".");
}
}
测试结果:100000为0.50557,1000000为0.507591,应该接近你的答案。