Python 在两个数字之间生成一个随机范围

Python 在两个数字之间生成一个随机范围,python,random,range,Python,Random,Range,pythonic(可以使用numpy)是如何在范围[range\u length\u min,range\u length\u max]中生成随机长度范围的 示例: start = np.random.randint(range_start, range_end - (range_max_length - range_min_length)) end = start + np.random.randint(range_min_length, range_max_length) 范围长度最小值

pythonic(可以使用numpy)是如何在范围
[range\u length\u min,range\u length\u max]
中生成随机长度范围的

示例:

start = np.random.randint(range_start, range_end - (range_max_length - range_min_length))
end = start + np.random.randint(range_min_length, range_max_length)
  • 范围长度最小值=5
  • 范围长度最大值=10
  • 范围\u开始=0
  • 范围=2000
允许的解决方案:

  • [53,59]
  • [934941]
无效解决方案:

  • [92,94]
    因为范围的长度小于
    范围长度\u min
  • [92104]
    因为范围的长度大于
    范围长度\u最大值
  • [-4,3]
    因为范围的起始值小于
    范围\u start
  • [1998,2004]
    因为范围结束小于
    范围结束
当前解决方案:

start = np.random.randint(range_start, range_end - (range_max_length - range_min_length))
end = start + np.random.randint(range_min_length, range_max_length)
这会给出正确的结果,但取样不均匀。
range\u end-(range\u max\u length-range\u min\u length)
是一个黑客攻击。

怎么样

from random import randint

a = randint(range_start, range_end - range_length_max)
b = randint(range_length_min, range_length_max)

r = [a, a+b]


只需尝试为特定需求创建一个函数:

>>> def foo(range_start, range_end, range_length_min, range_length_max):
...     v = random.randint(range_start, range_end)
...     v1 = random.randint(v + range_length_min, v + range_length_max if range_length_max <= range_end else range_end)
...     return [v, v1]
... 
>>> foo(range_start, range_end, range_length_min, range_length_max)
[1384, 1390]
def foo(范围开始、范围结束、范围长度最小、范围长度最大): ... v=random.randint(范围开始,范围结束) ... v1=random.randint(如果range\u length\u max>>foo(range\u start,range\u end,range\u length\u min,range\u length\u max),则v+range\u length\u max [1384, 1390]
以下是一种基于长度选择加权的方法:

import random

def rand_interval(lmin,lmax,a,b):
    """picks random subinterval in [a,b] with length between lmin and lmax inclusive"""
    weights = [b-a - x + 1 for x in range(lmin,lmax+1)]
    length = random.choices(range(lmin,lmax+1),weights)[0]
    start = random.randint(a,b-length)
    return start, start + length
测试:

import collections
print(collections.Counter(rand_interval(1,2,1,3) for _ in range(10000)))
典型输出:

Counter({(1, 2): 3389, (1, 3): 3386, (2, 3): 3225})

这个问题似乎没有明确规定。您希望区间的分布是什么?如果您希望从所有有效区间集中统一选择区间,则在编码之前需要解决一个数学问题,因为区间的长度在可能的长度范围内不是均匀分布的。@JohnColeman我需要均匀采样。范围长度和范围位置必须独立均匀地采样。“范围长度和范围位置必须独立均匀地采样”没有意义,因为长度和位置不是独立的。间隔越长,位置上的约束就越多。此外,较短的子间隔将比较长的子间隔多,因此如果要从有效间隔集中统一采样,您的选择必须偏向较短的子间隔lsAh,我的错。它们不是独立的。每个范围的可能性应该相等。例如,我当前的解决方案遗漏了边缘的范围,这是一个问题。根据所给出的配置,此解决方案无法生成
[1994,1999]
。我认为您可以使用,在整个范围内生成
a
,然后通过
range\u end
剪裁
a+b
,我认为该解决方案将有利于接近末尾的范围。与其他值相比,结尾更可能是
range\u end