从Python中的大量均匀分布中取样

时间:2014-02-05 19:26:06

标签: python memory sampling uniform

我需要从范围3.7*10^8中选择[0, 3*10^9]个唯一值,然后按顺序获取它们或将它们保存在内存中。

为了做到这一点,我开始研究一种简单的算法,在这种算法中我采样较小的均匀分布(适合内存),以便间接地采样我真正感兴趣的大分布。

该代码可在以下要点https://gist.github.com/legaultmarc/7290ac4bef4edb591d1e

中找到

由于我在实现更强大的功能方面遇到了麻烦,因此我想知道您是否有其他想法从大型离散均匀中采样唯一值。我正在寻找关于如何直接管理非常大的列表的算法,模块或想法(可能使用硬盘而不是内存)。

2 个答案:

答案 0 :(得分:0)

有一篇有趣的帖子Generating sorted random ints without the sort? O(n)表明,不是生成统一的随机整数,而是可以对指数随机增量进行运算和运算,这样就可以得到按排序顺序生成的统一随机结果。

不能保证完全您想要的样本数量,但应该非常接近,并且要快得多/更低的内存要求。

编辑:我找到了第二篇文章generating sorted random numbers without exponentiation involved?,建议在生成确切数量的样本时调整分布密度,但我很清楚这是什么做你的“统一”发行。

Edit2:我发生的另一种可能性是使用反向累积二项分布来迭代分割您的样本范围(预测有多少均匀生成的随机样本将落在范围的下半部分,然后其余部分必须在上半部分),直到块大小达到你可以轻松保存在内存中的东西。

答案 1 :(得分:0)

这是一个没有替换的标准样品。您不能将范围[0,3 * 10 ^ 9]划分为相同的分箱范围,并在每个箱中采样相同的数量。 此外,30亿相对较大,许多“随时可用”代码仅处理32位整数,大约20亿(+ - )。请仔细查看他们的实现。