生成非均匀随机数

时间:2018-05-11 16:20:16

标签: python arrays algorithm

Algo(来源:编程访谈的元素,5.16)

  

您将获得n个数字以及概率p0, p1,.., pn-1   总和为1.给定一个rand num生成器,它生成值   [0,1]统一地说,你将如何生成n个数中的一个   他们的具体概率。

实施例

  

如果数字是3,5,7,11,概率是9/18, 6/18, 2/18, 1/18,那么在程序的1000000 cals中,应该出现3   50万次,7次应出现111111次等

本书说创建间隔p0, p0 + p1, p0 + p1 + p2, etc所以在上面的示例中间隔为[0.0, 5.0), [0.5, 0.0.8333), etc,并且将这些间隔组合成有序的端点数组可能看起来像[1/18, 3/18, 9/18, 18/18]。然后运行随机函数生成器,找到大于生成元素的最小元素 - 它对应的数组索引映射到给定n数字中的索引。

这需要 O(N)预处理时间,然后 O(log N)才能二进制搜索该值。

我有一个替代解决方案需要 O(N)预处理时间和 O(1)执行时间,并且我想知道它可能有什么问题。

为什么我们不能遍历n中的每个数字,乘以[n] * 100 * probability that matches with n。 E.g [3] * (9/18) * 100。连接所有这些数组,最后得到一个包含100个元素的列表,每个映射的元素数量指示它发生的可能性。然后,将随机num函数和索引运行到数组中,并返回值。

这不会比提供的解决方案更有效吗?

2 个答案:

答案 0 :(得分:2)

您的号码100与输入无关;它取决于给定的p值。任何依赖于输入值的幅度的参数在输入大小中都是指数,这意味着您实际上使用的是指数空间。因此,构建该数组只需要指数时间,即使它被构造为在生成随机数后允许持续查找时间。

考虑两个p值,0.01和0.99。 100个值足以实现您的方案。现在考虑0.001和0.999。现在,您需要一个 1,000 值的数组来建模概率分布。空间量随着(我相信)最大p值与最小值之比而增长,而不是与给定的p值之比。

答案 1 :(得分:2)

如果你有理性概率,你可以做到这一点。而不是100,你必须使用合理比例的共同点。坚持100项不符合你指定的例子的规格,更不用说更多的恶魔了。