我在python中使用numpy模块生成随机数。当我需要以连续间隔(例如[a,b])生成随机数时,我将使用
(b-a)*np.random.rand(1)+a
但是现在我需要在[a,b]和[c,d]区间生成一个统一的随机数,该怎么办?
我想生成一个随机数,该随机数在所有间隔的长度上均是统一的。我没有以相等的概率选择一个间隔,然后在该间隔内生成一个随机数。如果[a,b]和[c,d]的长度相等,则此用法没有问题,但是当间隔的长度不相等时,此方法生成的随机数将不完全均匀。>
答案 0 :(得分:2)
您可以做类似的事情
a,b,c,d = 1,2,7,9
N = 10
r = np.random.uniform(a-b,d-c,N)
r += np.where(r<0,b,c)
r
# array([7.30557415, 7.42185479, 1.48986144, 7.95916547, 1.30422703,
# 8.79749665, 8.19329762, 8.72669862, 1.88426196, 8.33789181])
答案 1 :(得分:1)
您可以使用
np.random.uniform(a,b)
对于您在a和b之间的随机数(包括a但不包括b)
因此,对于[a,b]和[c,d]中的随机数,可以使用
np.random.choice( [np.random.uniform(a,b) , np.random.uniform(c,d)] )
答案 2 :(得分:1)
这是食谱:
def random_multiinterval(*intervals, shape=(1,)):
# FIXME assert intervals are valid and non-overlapping
size = sum(i[1] - i[0] for i in intervals)
v = size * np.random.rand(*shape)
res = np.zeros_like(v)
for i in intervals:
res += (0 < v) * (v < (i[1] - i[0])) * (i[0] + v)
v -= i[1] - i[0]
return res
In [11]: random_multiinterval((1, 2), (3, 4))
Out[11]: array([1.34391171])
In [12]: random_multiinterval((1, 2), (3, 4), shape=(3, 3))
Out[12]:
array([[1.42936024, 3.30961893, 1.01379663],
[3.19310627, 1.05386192, 1.11334538],
[3.2837065 , 1.89239373, 3.35785566]])
注意:即使它们的大小不同,它也会均匀分布在N个(不重叠)的间隔上。
答案 3 :(得分:0)
您可以仅指定[a,b]或[c,d]可能性的概率,然后相应地生成:
import numpy as np
import random
random_roll = random.random()
a = 1
b = 5
c = 7
d = 10
if random_roll > .5: # half the time we will use [a,b]
my_num = (b - a) * np.random.rand(1) + a
else: # the other half we will use [c,d]
my_num = (d - c) * np.random.rand(1) + c
print(my_num)