如何用Python生成25个2-25间总和为100的随机数?
生成25个2-25之间、总和为100的随机数解决方案
先理清楚核心要求:
- 一共25个整数,每个数必须在2到25之间
- 所有数加起来刚好是100
为什么你之前的方法不行?
你代码里先生成的是2-25的随机数(注意你写的size=100应该是笔误,应该是25),这些数的总和平均下来是25*(2+25)/2=337.5,远大于100,所以缩放系数必然小于1。这样一来,原数乘以系数后,不仅最大值达不到25,连最小值都会低于2,直接破坏了范围限制,肯定不行。
可行的实现思路
我们可以先把问题简化:每个数先减去最小值2,这样新的数范围变成0到23(因为25-2=23),此时总和需要是100 - 25*2=50。现在只需要生成25个0-23之间的非负整数,总和为50,最后把每个数加2就能还原成符合要求的数。
具体实现方法
方法1:拒绝采样(简单粗暴但好用)
直接生成符合范围的随机数,直到总和刚好是100,25个数的规模下速度很快:
import random def get_target_numbers(): while True: nums = [random.randint(2, 25) for _ in range(25)] if sum(nums) == 100: return nums # 测试 result = get_target_numbers() print("生成的列表:", result) print("总和:", sum(result)) print("最小值:", min(result)) print("最大值:", max(result))
方法2:约束性生成(更高效)
先生成总和为50的25个非负整数,再处理超出23的数值,最后还原范围:
import numpy as np import random def generate_constrained_nums(): # 生成25个非负整数,总和固定为50 y = np.random.multinomial(50, [1/25]*25, size=1)[0] # 处理超过23的数,把超出部分分配给其他数 while np.any(y > 23): # 找出所有超标的数,计算超出量 excess_indices = np.where(y > 23)[0] for idx in excess_indices: extra = y[idx] - 23 y[idx] = 23 # 把超出的部分随机分给没超标的数 for _ in range(extra): target_idx = random.choice(np.where(y < 23)[0]) y[target_idx] += 1 # 还原回2-25的范围 x = y + 2 return x.tolist() # 测试 result = generate_constrained_nums() print("生成的列表:", result) print("总和:", sum(result)) print("最小值:", min(result)) print("最大值:", max(result))
这两种方法都能保证生成的数满足所有约束,而且最大值有概率达到25(比如当某个y_i=23时,x_i=25,此时其他24个数的y总和是50-23=27,每个y至少0,24个数总和27是完全可行的)。
内容的提问来源于stack exchange,提问作者organicman276
相关产品推荐
相关产品推荐

