我今天有一个算法和数据结构实验室,该实验室将使用蒙特卡洛模拟法来计算排在倒数3位中的3位特定候选人的几率(按任何顺序,总共有6位候选人)。
我觉得我的算法应该可以工作,尽管即使我运行了数千次仿真,也只是找不到任何情况都位于前三名的情况。
我需要检查它们是否位于底部3位的候选人是pc
,gd
,sg
。
这是我的代码。
import java.util.*;
public class Lab4 {
public static void main(String[] args) {
Random rd = new Random();
double mh = (double)25/26;
//System.out.println(mh);
double pc = (double)1/10;
//System.out.println(pc);
double sg = (double)1/66;
//System.out.println(sg);
double lnr = (double)1/80;
//System.out.println(lnr);
double jf = (double)1/250;
//System.out.println(jf);
double gd = (double)1/500;
//System.out.println(gd);
int count = 0;
int votes = 200000;
int numSimulations = 5000;
int[] ar1 = new int[6];
for(int i = 1; i <= numSimulations; i++)
{
int mhCount = 0;
int pcCount = 0;
int sgCount = 0;
int lnrCount = 0;
int jfCount = 0;
int gdCount = 0;
for(int j = 1; j <= votes; j++)
{
double randomValue = rd.nextDouble()* 1.0951899766899766;
if(randomValue <= mh)
{
mhCount++;
}
else if(randomValue <= mh + pc)
{
pcCount++;
}
else if(randomValue <= mh + pc + sg)
{
sgCount++;
}
else if(randomValue <= mh + pc + sg + lnr)
{
lnrCount++;
}
else if(randomValue <= mh + pc + sg + lnr + jf)
{
jfCount++;
}
else if(randomValue <= mh + pc + sg + lnr + jf + gd)
{
gdCount++;
}
}
ar1[0] = mhCount;
ar1[1] = pcCount;
ar1[2] = sgCount;
ar1[3] = lnrCount;
ar1[4] = jfCount;
ar1[5] = gdCount;
Arrays.sort(ar1);
if(ar1[0] == pcCount || ar1[1] == pcCount || ar1[2] == pcCount)
{
if(ar1[0] == gdCount || ar1[1] == gdCount || ar1[2] == gdCount)
{
if(ar1[0] == sgCount || ar1[1] == sgCount || ar1[2] == sgCount)
{
count++;
}
}
}
}
System.out.println(count);
System.out.println((double)count/(double)numSimulations);
}
}
有谁对我如何使这种算法更好有任何想法?特别是如果我在其他地方分配选票...
有一个更好的方法吗?因为它们进入前三名的几率必须大于0,甚至是其0.0007 ..,而我的算法只是没有像往常一样捡起来..非常感谢!
最佳答案
个人获胜机会的总和(25/26 + 1/10 + ...)为〜1.09519,但您只能选择0到1.0705632798573974之间的随机数。更改该乘数并运行一千多个案例,您应该会看到所需的结果。
关于java - 蒙特卡洛模拟预测总统选举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53014984/