我想在 (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如果您只需要选择一次,则可以使用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)
| 归档时间: |
|
| 查看次数: |
900 次 |
| 最近记录: |