模仿微信紅包 python

python3.7實現
 

import random
from functools import reduce, wraps
import time


def runtime(f):
    @wraps(f)
    def func(*args, **kwargs):
        start_time = time.time()
        res = f(*args, **kwargs)
        print('運行時間:', (time.time() - start_time) * 1000)
        return res
    return func


def avg_bags(total=10, num=5):
    tmp_num = round(total / num, 2)
    arry = [tmp_num for i in range(num - 1)]
    arry.insert(random.randint(0, num - 1), round(total - tmp_num * (num - 1), 2))
    return arry

# 網上的例子 時間都差不多
@runtime
def redbags(money, num=10):
    choice = random.sample(range(1, money * 100), num - 1)
    choice.extend([0, money * 100])
    choice.sort()
    return [(choice[i + 1] - choice[i]) / 100 for i in range(num)]


@runtime
def random_bags(total=1, num=10):
    arry = [1] * num
    sum = num
    for i in range(num - 1):
        num_tmp = random.randint(0, total * 100 - sum)
        sum += num_tmp
        arry[i] += num_tmp
    arry[random.randint(0, num - 1)] += total * 100 - sum
    arry = list(map(lambda x: x / 100, arry))
    return arry


def verify(total=11, num=6):
    for i in range(1000):
        avg = avg_bags(total, num)
        avg = list(map(lambda x: x * 100, avg))
        if reduce(lambda x, y: x + y, avg) == total*100:
            pass
        else:
            print('avg******ERROR*******' * 8)

        not_avg = random_bags(total, num)
        arry = list(map(lambda x: round(x * 100), not_avg))  # float數乘以100後可能出現小數點位數變多問題 解決使用round()方法進行四捨五入
        if reduce(lambda x, y: x + y, arry) == total*100:
            pass
        else:
            print('******ERROR*******' * 8)
            print(not_avg)
            print(arry)


if __name__ == '__main__':
    print(avg_bags(11, 6))
    # print(redbags(100, 10))
    # print(random_bags(100, 10))
    verify()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章