Python 在两个数字之间生成一个随机范围
pythonic(可以使用numpy)是如何在范围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) 范围长度最小值
[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
。