【发布时间】:2014-01-27 13:45:02
【问题描述】:
使用硬币翻转生成均匀随机数 0..n 的常用方法是为大于 n 的 2 的最小幂构建一个 rng,然后每当该算法生成大于 n-1 的数字时,扔掉那个号码,然后再试一次。
不幸的是,这具有无穷大的最坏情况运行时间。
有没有办法在保证终止的同时解决这个问题?
【问题讨论】:
-
显然,n 可以写成 sum 2^p1 + 2^p2 + ...(假设有 q 个项)。然后你可以为前一个总和的每一项生成q个随机数,并将它们相加生成你搜索到的随机数。
-
看看stackoverflow.com/a/891304/916657 你可以以大量内存为代价实现你想要的。我宁愿使用常量内存方法,它在运行时实际上是有界的,因为它越来越不可能长时间运行。
-
@wxyz 这不是均匀分布,你不能指定范围。
-
@wxyz AND 均匀分布的随机变量的总和不是均匀分布的!
-
"不幸的是,这具有无穷大的最坏情况运行时间。" 是的,出现最坏情况的概率为零(0)。
标签: algorithm random probability random-sample coin-flipping