簡單聊聊微信紅包及其演算法
阿新 • • 發佈:2019-02-12
昨天有個小夥伴在微信群裡發一篇文章《如何實現搶紅包演算法》,本著學習的精神(上班太閒) 打開了看看。文章主要是介紹了兩種方法1.二倍均值法剩餘紅包金額為M,剩餘人生為N,那麼有如下的公式:每次搶到的金額 = 隨機區間 (0, M/N *2)舉個例子:假設有10個人,紅包金額為10元,第1個人搶到的金額範圍為 (0, 10/10 * 2),平均為1 元。第2個人搶到的金額範圍為 (0, 9/9 * 2),平均為1 元。...第10個人搶到的金額範圍為 (0, 1/1 * 2),平均為1 元。程式碼如下:
- import random
- from __future__ import division
- def average(amount, nums):
- remain_num
- for num in range(nums):
- if remain_num == 1:
- value = amount
- else:
- value = round(random.uniform(0.01, amount/remain_num * 2), 2)
- amount -= value
- remain_num -= 1
- print('第{}個人搶到{}元紅包,剩餘紅包{}元'.format(num+1, value, amount))
- >>> average(10, 10)
- 第1個人搶到0.58元紅包,剩餘紅包9.42元
- 第2個人搶到1.62元紅包,剩餘紅包7.8元
- 第3個人搶到0.55元紅包,剩餘紅包7.25元
- 第4個人搶到0.86元紅包,剩餘紅包6.39元
- 第5個人搶到1.7元紅包,剩餘紅包4.69元
- 第6個人搶到1.51元紅包,剩餘紅包3.18元
- 第7個人搶到0.32元紅包,剩餘紅包2.86元
- 第8個人搶到1.06元紅包,剩餘紅包1.8元
- 第9個人搶到1.43元紅包,剩餘紅包0.37元
- 第10個人搶到0.37元紅包,剩餘紅包0.0元
- >>> average(10, 10)
- 第1個人搶到0.35元紅包,剩餘紅包9.65元
- 第2個人搶到0.35元紅包,剩餘紅包9.3元
- 第3個人搶到1.58元紅包,剩餘紅包7.72元
- 第4個人搶到0.17元紅包,剩餘紅包7.55元
- 第5個人搶到2.48元紅包,剩餘紅包5.07元
- 第6個人搶到0.79元紅包,剩餘紅包4.28元
- 第7個人搶到0.99元紅包,剩餘紅包3.29元
- 第8個人搶到0.79元紅包,剩餘紅包2.5元
- 第9個人搶到0.33元紅包,剩餘紅包2.17元
- 第10個人搶到2.17元紅包,剩餘紅包0.0元
- import random
- def line_cut(total, number):
- """
- 生成切斷點 (list)
- :param total: 總數
- :param number: 人數
- :return:
- """
- cut_num = number - 1
- random_list = []
- for i in range(cut_num):
- while True:
- random_num = random.randint(1, total)
- if random_num not in random_list:
- random_list.append(random_num)
- break
- return sorted(random_list)
- def amount(total, random_list):
- """
- 根據切割點分配金額
- :param total:
- :param random_list:
- :return:
- """
- test_total = 0
- for i in range(len(random_list)+1):
- try:
- num = random_list[0] if i == 0 else random_list[i+1] - random_list[i]
- except:
- try:
- num = total - random_list[i]
- except:
- num = total - test_total
- test_total += num
- print('第{}個人分配金額{}, 剩餘金額{}'.format(i+1, num, total-test_total))
- if __name__ == '__main__':
- total, number = 100, 10
- random_list = line_cut(total, number)
- amount(total, random_list)