一个微信红包问题

2016/7/14 posted in  坏笔记不如好记性

在V2上看到一个问题:
将 100 元的红包分为 10 份,每份最低 5 元最高 15 元,金额精确到 0.01 元。那么如果算法没问题的话,每个人的期望值自然是平均值,即 100 元 /10 人=10 元 /人。

说下我大体的思路,我们可以把总金额设定为sum,人数为n,那么,要满足这个条件可以:
5n<=sum<=15n
也就是说,如果随机一个金额的话:
5(n-1)<=sum-randNum<=15(n-1)
化简一下:
sum-15(n-1)<=randNum<=sum - 5(n-1)

def comp(sum=100, n=10): 
    result = [] 
    while n > 1: 
        min = sum - 15 * (n - 1) if sum - 15 * (n - 1) >= 5 else 5
        max = sum - 5 * (n-1) if sum - 5 * (n-1) <= 15 else 15 
        rand = random.uniform(min, max) 
        rand = round(rand, 2) 
        result.append(rand) 
        sum -= rand 
        n -= 1 
        result.append(round(sum, 2)) 
    return result