提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

之前做的一个计票程序,需要用随机票数对程序进行样本测试,当然为了使测试接近于真实情况,对于三种投票结果(赞成、反对、弃权)按比例进行适当的调整。

下面我使用Python简单阐述一下这个简单的算法,首先获取一个随机票数,可以简单的通过随机一定范围的数字来实现,这个用Python实现比较简单,可以import random,然后通过random.randint(下限, 上限)来产生。我们可以先通过IDLE下面的脚本来查询使用方法:

import random
help(random.randint)
# -- output --
# Help on method randint in module random:
#
# randint(self, a, b) method of random.Random instance
#    Return random integer in range [a, b], 
#      including both end points.

输出上面已经给出,可见其上限和下限是包含的,所以要生成100以内的随机票数,只需要random.randint(0, 100),0票是允许的,范围就是0~100。

那么如果需要按比例调整的话,只需要将最大票数,比如上界100分别乘以赞成、反对或者弃权的比例,然后作为randint的上界,再分别产生赞成、反对或者弃权的票数即可,当然我们在输出最终票数前,还需要检测下产生的三类票数之和是否越界(超过总票数),然后再多退少补,至于补到哪个上面可以随机或者按比例调整平均补上,这里提供的实现代码是按随机方式补足的:

# -*- coding:UTF-8 -*-
from math import floor
import random

def getRandomVotes(limit):
    """ 得到随机数字作为投票票数,limit是有效票数 """
    votes = [0, 0, 0]
    a = floor(limit * 0.73)
    b = floor(limit * 0.22)
    c = floor(limit * 0.05)
    votes[0] = random.randint(0, a)
    votes[1] = random.randint(0, b)
    votes[2] = random.randint(0, c)
    total = sum(votes)
    if total == limit:
        return votes
    if total > limit:
        leave = total - limit
        index = random.randint(0,2)
        votes[index] = votes[index] - leave
    else:
        leave = limit - total
        index = random.randint(0,2)
        votes[index] = votes[index] + leave
    return votes

if __name__ == "__main__":
    print getRandomVotes(100)
    print getRandomVotes(100)

好了,说了这么多,其实是个很简单的算法,算作是我的Python程序的小练习吧。