C++ c+中的统计模拟+;

C++ c+中的统计模拟+;,c++,C++,我试图解决斯坦福大学免费在线CS106B课程中给出的一个问题。问题的文本如下所示。我已经写了一个函数,但我不确定逻辑是否正确(当你知道答案正确时,这些程序中没有一个是正确的)。请参阅下面的问题和我的代码。如有任何反馈/建议,我将不胜感激 问题: 考虑1000个选民的选举,两个候选人之间有一个百分点的分摊,即50.5%票赞成一个候选人,49.5%票赞成另一个候选人。投票机在8%的时间内出错,并记录对与预期相反的候选人的投票。这个错误率是否足以使选举结果无效? 有了一点统计学知识,就不难计算出无效结

我试图解决斯坦福大学免费在线CS106B课程中给出的一个问题。问题的文本如下所示。我已经写了一个函数,但我不确定逻辑是否正确(当你知道答案正确时,这些程序中没有一个是正确的)。请参阅下面的问题和我的代码。如有任何反馈/建议,我将不胜感激

问题:
考虑1000个选民的选举,两个候选人之间有一个百分点的分摊,即50.5%票赞成一个候选人,49.5%票赞成另一个候选人。投票机在8%的时间内出错,并记录对与预期相反的候选人的投票。这个错误率是否足以使选举结果无效? 有了一点统计学知识,就不难计算出无效结果的确切概率,但更容易模拟这个过程。为候选人a生成505张选票,为候选人B生成495张选票,其中每张选票在记录时有8%的机会被颠倒。选票总数是否会导致B击败A,尽管选民的初衷是这样的?此结果代表模拟中的一次试验。如果您多次重复此试验并跟踪结果,则比率:

(选举结果无效的审判次数)/(审判总数)

提供无效选举结果概率百分比的估计值

编写一个程序,提示用户输入投票模拟参数,然后执行500次模拟试验,并报告上面计算的比率。该程序的运行示例如下所示:

输入投票人数:10000 输入候选人之间的百分比分布:.005
输入投票错误百分比:.15 500次试验后无效选举结果的概率=13.4%

您的程序应注意验证用户选择的模拟参数是否在范围内(百分比必须为0到1.0,投票者数量应为正数),如有必要,重新提示有效输入。请注意,由于模拟中的随机性,预计每次运行的结果都会有所不同

代码(p.S.我使用了斯坦福CPP库):


我大约有30%的时间都在做无效选择。看起来有点高。问题文本说,在这些参数下,我应该得到13.4%的近似值(由于随机性,每次运行时略有变化)。我认为我的逻辑有问题,但我不知道在哪里。

我相信你的程序是正确的

如果人们以0.5025的概率投票给候选人A,而投票机以0.15的概率错误登记选票,则意味着投票机将以0.5025*(1-0.15)+(1-0.5025)*0.15=0.50175的概率登记候选人A。当我把它代入二项式分布中,发现10000张选票中A的概率小于5000张,我发现概率约为0.36

这只是一个粗略的估计,不是一个正确的计算,但它表明你的30%可能不会太高

(更新:为了确保这一点,我还编写了一个快速Python程序,使用另一种技术解决了这个问题,它也提供了大约30%的支持率。)

更新2:今天早上我醒来时想到了一种计算精确概率的方法,我不得不尝试一下。所以这里有一种方法可以通过scipy找到它

import scipy.stats as ss

numVoters = 10000
voterSpread = 0.005
votingError = 0.15

correctVotersLower = int(numVoters*(0.5 - 0.5*voterSpread))
correctVotersHigher = int(numVoters*(0.5 + 0.5*voterSpread))

votersDifference = correctVotersHigher - correctVotersLower
minHighErrors = (votersDifference + 1) / 2

lowerErrorDist = ss.binom(correctVotersLower, votingError)
higherErrorDist = ss.binom(correctVotersHigher, votingError)

print sum([higherErrorDist.sf(x + minHighErrors) * lowerErrorDist.pmf(x) for x in range(0,correctVotersLower)])

我得到的概率约为0.305598。

您没有解释您发布的代码存在的问题,也没有提出问题。请参阅和。不要在评论中添加信息。相反,您可以发布帖子并将它们添加到问题本身的相应位置。您可以将
randomChance
函数添加到问题中吗?您可以澄清voterSpread参数的含义吗?如果一个候选人的分数是49.5,另一个是50.5,那么voterSpread应该是.005还是.010?你的代码似乎假设了后者,但我不确定这是否是你的本意。“投票机有8%的时间出错”-好吧-这解释了唐纳德·特朗普和英国脱欧谢谢!这正是我想知道的(即交叉验证模拟结果的问题的统计解决方案)。是的,选民分布是领先者和落后者之间的百分比差异。如果票数是0.49对0.51,那么价差是0.02。如果你想要精确的理论解,我想你可以试试。我本人更像是一名程序员,我已经有几年没有积极从事统计工作了,所以我需要花一些时间来找出确切的解决方案。但这就是为什么我们使用电脑,对吗?
numVoters = 10000;
numSumulations = 500;
voterSpread = 0.005;
votingError = 0.15;
import scipy.stats as ss

numVoters = 10000
voterSpread = 0.005
votingError = 0.15

correctVotersLower = int(numVoters*(0.5 - 0.5*voterSpread))
correctVotersHigher = int(numVoters*(0.5 + 0.5*voterSpread))

votersDifference = correctVotersHigher - correctVotersLower
minHighErrors = (votersDifference + 1) / 2

lowerErrorDist = ss.binom(correctVotersLower, votingError)
higherErrorDist = ss.binom(correctVotersHigher, votingError)

print sum([higherErrorDist.sf(x + minHighErrors) * lowerErrorDist.pmf(x) for x in range(0,correctVotersLower)])