微信发红包算法,求助

2018-10-15 16:22:33 +08:00
 ropon
比如 100 元红包 10 个人抢,以下算法:先随机生成 10 个数,之和等于红包金额,然后依次从这个列表随机取一个
,取了后移除,在随机取一个,这样算法是否合理,公平不呢

def hongbao(amount=5, count=3):
s = []
sum = 0
min = 0.01
max = float(amount) - count * 0.01
num = 0
for i in range(count-1):
num = round(random.uniform(0, float(amount) - sum), 2)
while num < min or num > max:
num = round(random.uniform(0, float(amount) - sum), 2)
sum += num
s.append(num)
s.append(round(float(amount) - sum, 2))
# return s
for i in range(count):
temp = random.choice(s)
print("第{0}个人抢的红包是{1}".format(i + 1, temp))
s.remove(temp)


hongbao(100, 10)

测试有问题,问题在哪里呢
2101 次点击
所在节点    Python
5 条回复
beny2mor
2018-10-15 17:07:29 +08:00
难读...
crab
2018-10-15 17:09:24 +08:00
二倍均值法
beny2mor
2018-10-15 17:10:21 +08:00
beny2mor
2018-10-15 17:12:49 +08:00
我看了下那些 stackoverflow 的回复,
最简单的是生成 10 个随机数,然后按照比例来分 100 元
ropon
2018-10-15 22:26:51 +08:00
整理思路如下:

#算法一
#################################################################
def hongbao(amount=5, count=3):
s = []
min = 1 #分
amount = amount * 100 #单位分
max = amount - (count-1) #单位分
for i in range(count-1):
# num = random.randint(0, amount)
num = random.uniform(0, int(amount))
while num < min or num > max:
num = random.uniform(0, int(amount))
amount -= num
s.append(round((num / 100), 2))
s.append(round((amount / 100), 2))
random.shuffle(s)
return s
print(hongbao(1, 6))
##############################################################

算法二
#############################################################
# 0--|----|--------|-----------|-------20
# 0 2 4 10 16 20

def hongbao(amount=10, count=5):
ret = random.sample(range(1, amount * 100), count - 1) #分为单位
ret.extend([0, amount * 100]) #追加多个值 0 amount * 100
ret.sort() #排序
# return [((ret[i+1] - ret[i]) / 100 for i in range(num))] # 列表生产式
for i in range(count):
yield (ret[i+1] - ret[i]) / 100

res = hongbao(10, 6)
for i in res:
print(i)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/497800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX