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()