我今天有一个算法和数据结构实验室,该实验室将使用蒙特卡洛模拟法来计算排在倒数3位中的3位特定候选人的几率(按任何顺序,总共有6位候选人)。

我觉得我的算法应该可以工作,尽管即使我运行了数千次仿真,也只是找不到任何情况都位于前三名的情况。

我需要检查它们是否位于底部3位的候选人是pcgdsg

这是我的代码。

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/

10-12 03:06