大体思路:
1. 参数:张数、总金额
2. 在给定的范围里产生一个随机数列表
3. 判断产生的随机数总和与给定的总和是否相等
a.大于时,将差值除以随机数数量取商,每个随机数减去这个商值
①如果随机数减去商值要是超出范围,那么该值就为范围的最小值,剩下的值从随机数中
的最大值减去
②再取差值除以随机数数量的模值,随机数从大到小依次减1,如果随机数已经等于最小
值,那么从随机数中的最大值上减1
b.小于时。。。思路同上
import random
def random_number(a, b, maximum):
"""
给定范围中间值、范围最大值,在该范围内取出a个随机数,随机数总和为范围中间值。
:param a: a为生成随机数的个数
:param b: 设定随机数的总和
:param maximum: 每个随机数要<=maximum
:return: 返回随机数列表n2_l,s2为随机数的总和,minimum为范围最小值
"""
average = b // a
minimum = 2*average-maximum # 将minimum通过参数传入,可以实现任意范围产生随机数
n_l = list() # 用于存储未经处理随机数
# n_l = [36, 39, 22, 43, 24, 97]
for _ in range(0, a):
n_l.append(random.randint(minimum, maximum))
# n3_l = n_l.copy()
s = 0 # 用于存储未经处理随机数总和
for i in n_l:
s = i + s
# print(s)
n2_l = list() # 用于存储处理后的随机数
if b - s > 0:
n_l.sort(reverse=True)
# print(int((b-s)/a))
aa = int((b-s)/a)
for i2 in n_l:
if i2+int((b-s)/a) <= maximum:
n2_l.append(i2+int((b-s)/a))
else:
n2_l.append(maximum)
n_l[-1] = n_l[-1]+int((b-s)/a)-(maximum-i2)
n_l.sort(reverse=True)
n_l.sort()
if (b-s) % a != 0:
for i4 in range(0, (b-s) % a):
if n2_l[i4] == maximum:
n_l.sort()
n2_l[-1] = n2_l[-1] + 1
else:
n2_l[i4] = n2_l[i4]+1
else:
n_l.sort()
aa = int((s - b) / a)
# print(int((s - b) / a))
for i3 in n_l:
if i3-int((s-b)/a) >= minimum:
n2_l.append(i3-int((s-b)/a))
else:
n2_l.append(minimum)
n_l[-1] = n_l[-1] - (int((s-b)/a) - (i3-minimum))
n_l.sort(reverse=False)
bb = (s - b) % a
if (s - b) % a != 0:
n2_l.sort(reverse=True)
for i4 in range(0, (s - b) % a):
if n2_l[i4] == minimum:
n2_l.sort(reverse=True)
n2_l[0] = n2_l[0] - 1
else:
n2_l[i4] = n2_l[i4] - 1
s2 = 0 # 用于存储处理后的随机数总和,该值等于参数b
for i3 in n2_l:
s2 = i3 + s2
# print(s2)
n2_l.sort(reverse=True)
return n2_l, s2, minimum
if __name__ == "__main__":
# 测试产生随机数是否均满足要求(检查是否有bug)
ii = 0
c = list()
d = list()
f = list()
num1 = 4
num2 = 377
maximum1 = 100
while ii < 10000000:
n = random_number(num1, num2, maximum1)
print(n)
ii += 1
c.append(n[1])
d.append(n[0][-1])
f.append(n[0][0])
a1 = 0
a2 = 0
a3 = 0
for iii, iiii, iiiii in zip(c, d, f):
if iii != num2:
a1 += 1 # 判断随机数的总和有没有不等于给定的总和的
if iiii < n[2]: # 判断随机数中是否有小于最小值的
a2 += 1
if iiiii > maximum1: # 判断随机数中是否有大于最大值的
a3 += 1
print(a1, a2, a3) # a1、a2、a3都为0时表示数据随机数在范围内