我有一些麻烦从直方图中绘制一个随机数。
如果我使用直方图来表示概率分布函数,如何从该分布中有效地生成0到1之间的70128个随机数,然后绘制它们?我也希望列表中的随机数,然后我可以在以后使用它们。
我的直方图代码如下:
`N = EU_Nodes(load_filename = "linear_gamma=1_B=0_A=0.7.npz")
def close(a,b):
return ((a < (b*1.00001 + 1e-6)) and (a > (b* 0.99999 - 1e-6))) or (a==b)
def non_zeros(s):
v=[]
for w in s:
if not close(w,0):
v.append(w)
return v
x0=-3
x1=3
b=np.arange(x0,x1,(x1-x0)/250.)
u=np.array(N[15].mismatch, dtype=np.float)
uu=np.array(sum(N[15].load)/70128, dtype=np.float)
uv=u/uu
plt.plot(b[0:-1], plt.hist(non_zeros(-uv), bins=b, normed=1, visible=0)[0], color = "k")`
答案 0 :(得分:0)
这是一个采用直方图和与每个直方图桶相对应的值的类。 random
方法返回一个随机值,其分布与直方图相同。
import bisect
import random
def accumulate(iterable):
''' Produce an accumulated total of the input; adapted from Python 3 itertools.accumulate
'''
it = iter(iterable)
total = next(it)
yield total
for element in it:
total += element
yield total
class distrib:
def __init__(self, hist, values):
total = sum(hist)
self.ranges = [accumulate(x/total for x in hist)]
self.ranges[-1] = 1.0 # insure against roundoff error
self.values = values
def random(self):
i = bisect.bisect_left(self.ranges, random.random())
return self.values[i]