从直方图中绘制一个随机数

时间:2014-10-21 13:53:05

标签: python random plot numbers histogram

我有一些麻烦从直方图中绘制一个随机数。

如果我使用直方图来表示概率分布函数,如何从该分布中有效地生成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")`

1 个答案:

答案 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]