在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