来自不连续集合的 numpy.random.uniform

Ben*_* C. 3 python numpy

我想在 (a,b)\xe2\x88\xaa(c,d)\xe2\x88\xaa...\xe2\x88\xaa(e,f) 形式的集合中均匀生成一个随机数,其中 a < b < c ... 且 a > 0,且 f < 1。这可以使用 numpy.random.uniform 函数吗?

\n

FBr*_*esi 5

如果您只需要选择一次,则可以使用np.random.choice

import numpy as np
a, b, c, d = 0, 0.3, 0.7, 1

# Specify relative probabilities
prob = np.array([b-a, d-c])
prob = prob/prob.sum() # Normalize to sum up to one

r = np.random.choice([np.random.uniform(a, b), np.random.uniform(c, d)],
                     p=prob)

r
0.9662186527199109
Run Code Online (Sandbox Code Playgroud)

如果需要生成很多值:

n=10
R = np.array([np.random.choice([np.random.uniform(a, b),np.random.uniform(c, d)], 
                               p=prob) 
              for _ in range(n)])

R
array([0.19130148, 0.24858629, 0.75106557, 0.11057559, 0.9276096 ,
       0.01849698, 0.89433504, 0.99455349, 0.10128313, 0.23325187])
Run Code Online (Sandbox Code Playgroud)

我们可以看到添加概率参数会产生预期结果:

a,b,c,d,e,f = 0, .1, .2,.25, .5, 1
prob = np.array([b-a, d-c, f-e])
prob = prob/prob.sum()
n=10_000
R = np.array([np.random.choice([np.random.uniform(a, b), 
                                np.random.uniform(c, d),
                                np.random.uniform(e, f)], 
                               p=prob) 
              for _ in range(n)])

print(prob)
array([0.15384615, 0.07692308, 0.76923077])

print(R[np.logical_and(R>a, R<b)].size/n, R[np.logical_and(R>c, R<d)].size/n, R[np.logical_and(R>e, R<f)].size/n)
0.1537 0.0709 0.7754
Run Code Online (Sandbox Code Playgroud)