java - 蒙特卡洛模拟预测总统选举

标签 java

我今天有一个算法和数据结构实验室,该实验室将使用蒙特卡罗模拟来计算 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);
    }   
}

有人对如何改进这个算法有任何想法吗?特别是我分配选票的 if,else if... 有一个更好的方法吗?因为它们进入最后三名的几率必须大于0,即使是0.0007..而我的算法只是没有像以前那样把它们捡起来..非常感谢!

最佳答案

个人获胜机会的总和 (25/26 + 1/10 + ...) 约为 1.09519,但您只选择 0 到 1.0705632798573974 之间的随机数。更改该乘数并运行一千多个案例,您应该会看到您正在寻找的结果。

关于java - 蒙特卡洛模拟预测总统选举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53014984/

相关文章:

java - XML - 在节点上使用文档方法

java - 如何在Java中实现搜索 token (如mac Lion中)?

java - 在 Android 上从 mp3 快速转换为 WAV

java - 自定义微调器适配器中未显示图像显示

java - WebView.loadData 不适用于 Android 9.0 (API-29)

Java - 同步原始数组中的各个元素

java - Micronaut:如何映射 HashMap 中的所有属性值?

javascript - java而不是cordova元素中的html、css和js

java - 文件不以换行符结尾 [NewlineAtEndOfFile]

java - Camel : define jms queue name from properites file