随笔 - 51, 文章 - 1, 评论 - 41, 引用 - 0
数据加载中……

倒数1、2的票数相同的概率

我是歌手第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))

posted on 2016-01-17 20:03 lemene 阅读(188) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理