微信群红包算法

时间:2021-04-15 18:49:52

今天是春节的最后一天上班,没什么事情,正好群里面的同学再讨论群红包的算法。

特写了个算法。大致思路是找发过的红包,寻找它的随机震动坡度。


下面来看看算法吧:

#coding=gbk
import random
import sys

#print random.randint(0, 99)

#print "====", random.uniform(0, 0.99)

def calRandomValue(min, max, total, num):
	print min, max, total, num
	total = float(total)
	num = int(num)
	min = 0.01
	if(num < 1): 
		return
	if num == 1:
		print "第%d个人拿到红包数为:%.2f" %(num, total)
		return
	
	i = 1
	total_money = total

	#rtotal = (total*100 - min*num*100)/100
	while( i < num ):
		max = total_money - min*(num- i)
		k = int((num-i)/2)
		if num -i <= 2:
			k = num -i
		max = max/k
		monney = random.randint(int(min*100), int(max*100))
		monney = float(monney)/100
		total_money = total_money - monney

		print "第%d个人拿到红包数为:%.2f, 余额为: %.2f" %(i, monney, total_money)
		i += 1
	
	print "第%d个人拿到红包数为:%.2f, 余额为: %.2f" %(i, total_money, 0.0)


if __name__ == "__main__":
	min = sys.argv[1]
	max = sys.argv[2]
	total = sys.argv[3]
	num = sys.argv[4]
	calRandomValue(min, max, total, num)

执行:

python 2.py 0.01 10 20 30
0.01 10 20 30
第1个人拿到红包数为:0.42, 余额为: 19.58
第2个人拿到红包数为:0.12, 余额为: 19.46
第3个人拿到红包数为:0.24, 余额为: 19.22
第4个人拿到红包数为:1.10, 余额为: 18.12
第5个人拿到红包数为:1.45, 余额为: 16.67
第6个人拿到红包数为:0.21, 余额为: 16.46
第7个人拿到红包数为:0.34, 余额为: 16.12
第8个人拿到红包数为:0.16, 余额为: 15.96
第9个人拿到红包数为:1.38, 余额为: 14.58
第10个人拿到红包数为:0.86, 余额为: 13.72
第11个人拿到红包数为:1.18, 余额为: 12.54
第12个人拿到红包数为:0.93, 余额为: 11.61
第13个人拿到红包数为:0.70, 余额为: 10.91
第14个人拿到红包数为:0.60, 余额为: 10.31
第15个人拿到红包数为:0.03, 余额为: 10.28
第16个人拿到红包数为:0.61, 余额为: 9.67
第17个人拿到红包数为:1.37, 余额为: 8.30
第18个人拿到红包数为:0.67, 余额为: 7.63
第19个人拿到红包数为:0.28, 余额为: 7.35
第20个人拿到红包数为:0.96, 余额为: 6.39
第21个人拿到红包数为:1.30, 余额为: 5.09
第22个人拿到红包数为:1.08, 余额为: 4.01
第23个人拿到红包数为:1.12, 余额为: 2.89
第24个人拿到红包数为:0.75, 余额为: 2.14
第25个人拿到红包数为:0.64, 余额为: 1.50
第26个人拿到红包数为:0.37, 余额为: 1.13
第27个人拿到红包数为:0.01, 余额为: 1.12
第28个人拿到红包数为:0.26, 余额为: 0.86
第29个人拿到红包数为:0.31, 余额为: 0.55
第30个人拿到红包数为:0.55, 余额为: 0.00


python 2.py 0.01 10 20 2
0.01 10 20 2
第1个人拿到红包数为:1.62, 余额为: 18.38
第2个人拿到红包数为:18.38, 余额为: 0.00


python 2.py 0.01 10 20 3
0.01 10 20 3
第1个人拿到红包数为:4.58, 余额为: 15.42
第2个人拿到红包数为:11.22, 余额为: 4.20
第3个人拿到红包数为:4.20, 余额为: 0.00