You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:01:23