Python:每日一题 96(答题领鱼币)
我们都知道微信红包,把一个红包随机分成n份,每人拿到的钱数不尽相同。现在模拟这个算法,把100块钱,随机分成10份,为了简化每个人的钱数都是整数。
例如:
7
1
9
11
3
13
10
11
2
9
24
我的解法:
**** Hidden Message ***** from random import randint
n=100
k=10
while n:
if k:
hb = randint(1,n-k+1)
n -= hb
k -= 1
print("第%d个红包是%d元,红包剩余%d元" % (abs(k-10), hb, n))
#运行结果
第1个红包是6元,红包剩余94元
第2个红包是5元,红包剩余89元
第3个红包是18元,红包剩余71元
第4个红包是26元,红包剩余45元
第5个红包是11元,红包剩余34元
第6个红包是29元,红包剩余5元
第7个红包是2元,红包剩余3元
第8个红包是1元,红包剩余2元
第9个红包是1元,红包剩余1元
第10个红包是1元,红包剩余0元 import random
money = *10
while(100 != money + money + money + money + money + money + money + money + money + money):
for i in range(10):
money = random.randint(1,50) #缺点:当randint第二个参数过大时,python会很慢,所以目前调成50,我微信抢红包从不过50...
for i in money:
print(i)
其中一个结果:
1
12
4
25
1
4
8
4
9
32
def hongbao(money,number):
import random
while money:
if number:
bb = random.randint(1,money - number +1)
print(bb)
money -= bb
number -= 1
hongbao(100,10) import random
def hongbao(a,b):
x=[]
for i in range(b-1):
c =random.randint(1,a-b+i)
a = a-c
x.append(c)
x.append(a)
return(x)
a=100
b=10
h=hongbao(a,b)
print(h)
这是刚开始的想法 第一个随机拿 后面的人 挨个从剩下的随机拿 后来发现 后面拿的钱都很少 如果是分红包 显得不公平
import random
def hongbao1(a,b):
x=[]
y=[]
for i in range(b-1):
x.append(random.randint(1,b))
for i in x:
y.append(int(i/sum(x)*a))
y.append(a-sum(y))
return(y)
a=100
b=10
g=hongbao1(a,b)
print(g)
这是后来写的先随机 生成9个数 然后 每个数除以 他们的和 最后一个人拿 零头(为了凑够100块) 虽然最后一个人不算公平 但谁叫他抢的慢呢
我觉得自己掌握的代码太少了 来看看大神都是怎么做的 楼主 思维强大
看楼上的突然有个 想法 10个人每次 随机发给一个人 一块钱发100次 就完事了
import random
def hongbao2(a,b):
x=*b
for i in range(a):
x += 1
return(x)
g=hongbao2(a,b)
print(g)
lookand study from random import randint
def hongbao(money, size):
t = []
t.append(money)
for i in range(1,size+1): # size+1 为了最后一个红包不为0.
if i == size-1:
t.append(money - sum(t))
else:
t.append(max(t) - randint(1, max(t)-1))
t = max(t) - t[-1]
t.remove(0)
return t 本帖最后由 solomonxian 于 2017-9-9 14:34 编辑
用正态分布吧,可能比较符合现实
标准差对应分散程度,按循环次数上取u-3σ>= 0下最大比较好,
但是如果分散一点貌似更好玩,取 u/2, 小数点保留1位好了
有 2.5% 概率出现负数,那就递归再来一遍,钱一定要比人数多大
import random, math
def fun(money, people):
lst = sorted(round(random.gauss(money//people, money//people//2),1) for _ in range(people))
temp = round(money - math.fsum(lst),1)
num = sorted([(temp,0),(temp+0.1,-1)], key=lambda x :abs(x)) # 因为精度是0.1
lst = round(lst + temp, 1)
random.shuffle(lst)
return fun(money, people) if sorted(lst)<=0 else lst from random import randint
def hb(n):
money =100
k =1
while n:
person_money = randint(0,money)
#为保证公平,设置范围且金额不能为0.否则重新随机
if n>1:
while person_money > money/(n-1) or person_money ==0:
person_money = randint(0,money)
else :
person_money = money
print('第%d个人的红包是%d元'%(k,person_money))
money -= person_money
n -=1
k +=1
hb(10) 学习一下 微信红包的分配策略是随机数取1~剩余均值的2倍,倒数第二个人取1~剩余总数,最后一个人全收。 import random
N=100
num = 10
while(N>1):
money = random.randint(1,N-num+1)
print(money)
N-=money
num-=1
print(N) from random import randint as r
i=0
def f(n):
global i
while i<10:
a=r(1,n-9+i)
print(a)
i+=1
return f(n-a)
f(100)
————————————————
运行结果
58
3
10
23
1
1
1
1
1
1
>>>
===================== RESTART: D:\Python36-32\caogao.py =====================
56
15
7
5
2
10
1
1
1
2
>>> 本帖最后由 schweinfan 于 2017-9-9 22:51 编辑
import random as r
rest_money = 100
rest_num = 10
for i in range(1,10):
current = r.randint(1, rest_money - rest_num + 1)
print('第%d个红包,金额为%d元' % (i, current))
rest_num-= 1
rest_money = rest_money - current
print('第10个红包,金额为%d元,红包已抢完' % rest_money)
输出为:
第1个红包,金额为16元
第2个红包,金额为10元
第3个红包,金额为33元
第4个红包,金额为13元
第5个红包,金额为9元
第6个红包,金额为5元
第7个红包,金额为3元
第8个红包,金额为3元
第9个红包,金额为4元
第10个红包,金额为4元,红包已抢完
应该是符合题意的,但结果基本都是前面抢到的金额大。。所以还是微信的算法更合理吧 from random import randint
list1 = []
for each in range(10):
list1.append(randint(1,101))
total = sum(list1)
for i in range(10):
list1 = int(100 * list1 / total + 0.5)
print(list1)
print(sum(list1)) 没思路。。
6666666666666666 ```python
import random
num =
summ = sum(num)
a=[]
for i in num:
temp = i / summ * 100
print('天了噜!发财了抽中%s元'%int(temp+0.5))
``` 100