从离散分布抽样而无需替换,其中概率会随着每次抽签而改变

时间:2018-06-21 08:10:51

标签: c++11 random statistics distribution

我有一个序列 S =(s1,s2,... sk),每个序列位点的概率权重 P =(p1,p2,... pk),其中 P = 1 的最大长度 S 的总和可能约为 10 ^ 9 通过仿真,每次抽奖后都会选择并修改一个站点k,因为pk每次运行都会改变。每次模拟的预期站点交换次数约为 5万-10万

问题1:您如何建议绘制网站? 实际上,我实现了这种逻辑,就像在文献see e.g. here中一样,这种逻辑本身似乎还可以:

    counter = 0
    random_number = draw_random()  #<= float in range 0,1
    while P_sum <  random_number
        P_sum += P[counter]
        counter++
    return counter

通过测试模拟,我观察到一个强烈的偏差似乎重建了随机发生器分布(see_here)三个不同的发生器会产生3个不同的结果……这还可以,但是在所有状态下都不正确 Walkers和Knuth使用查找表的方法对我来说似乎太昂贵了,因为每次都必须重新计算查找表。

问题2 如何减少随机性带来的偏见?实际内置了3种不同的生成器(每次仿真仅使用一种生成器),它们根据机会均匀分布。不知道一行模拟代码时,知道这是一个沉重的问题

问题3 东西库? 因为不需要太多代码,所以我自己编写就没有问题,但是有没有针对它的另一个库?问这个question可能已经过时了...不是Boost,因为我不想建立第四个随机生成器并使用大的东西

问题4 更快的替代方法?

我知道这个主题可能在几千年前就得到了回答-但没有一个答案能使我满意,也没有给我一个明智的选择。 here似乎有相同的问题,但我不知道是在哪个堆中构建的,为什么对这种“简单”的事情而言,它看起来非常复杂

感谢您的支持!

0 个答案:

没有答案