我是歌手第4季第一集就出现了倒数1、2名票数相同的情况,使得原本应该淘汰一名选手的赛制无法执行。出现这种概率的情况有多大?下面是粗略模拟计算其概率的python代码。虽然无法估计每个候选人的权重,但出现倒数1、2名票数相同的情况也有百分之几,概率不小。
"""本程序测试在投票活动中,出现并列倒数第一的概率是多少"""
import random
def onePoll(candidates):
"""候选人进行一次投票
Parameters
----------
candidates: [Integer]
候选人的权重,权重越大越可能被投票,len(candidates)是候选人数
Returns
-------
choiced: Integer, [0, len(candidates))
被投票候选人的序号
"""
t = sum(candidates)
n = random.randint(0, t-1)
for i in range(len(candidates)):
if (n >= candidates[i]):
n -= candidates[i]
else:
return i
else:
assert False, "不应该进入该分支"
def generatePollResult(voters, candidates):
"""产生投票结果
Parameters
----------
voters: Integer
投票人数
candidates: [Integer]
候选人的权重,权重越大越可能被投票,len(candidates)是候选人数
Returns
-------
result: [Integer]*len(candidates)
每个人所得票数
"""
result = [0]*len(candidates)
for i in range(voters):
result[onePoll(candidates)] += 1
return result
def simulate(count, voters, candidates, judge):
"""模拟投票行为,统计满足要求的投票结果的概率
Parameters
----------
count: Integer
模拟投票的次数
voters: Integer
投票人数
candidates: [Integer]
候选人的权重,权重越大越可能被投票,len(candidates)是候选人数
judge: bool ([Integer]*len(candidates))
对投票结果是否符合要求的判断
Results
-------
prop: Float
所求投票结果的概率
"""
satisfied = 0
for i in range(count):
result = generatePollResult(voters, candidates)
if (judge(result)):
satisfied += 1
return float(satisfied) / count
if __name__ == "__main__":
def isLast2Equal(result):
result.sort()
return result[0] == result[1]
print(simulate(1000, 500, [110,120,130,140,150,160,170,180], isLast2Equal))