如果我有一个名为 rand1() 的函数生成数字 0(30% 概率)或 1(70% 概率),如何编写一个函数 rand2() 生成数字 0 或 1 等概率使用 rand1() ?
更新:</p>
最后发现这是《算法导论(第2)》(我买了这本书的中文版)Excercise 5.1-3这本书的一个问题,原来的问题是:
5.1-3 假设要以概率 1/2 输出 0,以概率 1/2 输出 1。您可以使用一个程序 BIASED-RANDOM,它输出 0 或 1。它以某个概率 p 输出 1,以概率 1− p 输出 0,其中 0 < p < 1,但您不知道 p 是什么。给出一个使用 BIASED-RANDOM 作为子程序的算法,并返回一个无偏的答案,以 1/2 的概率返回 0,以 1/2 的概率返回 1。作为 p 的函数,您的算法的预期运行时间是多少?
解决办法是:(见:http ://www.cnblogs.com/meteorgan/archive/2012/05/04/2482317.html )
为了得到一个无偏的随机位,只需要调用 BIASED-RANDOM,调用 BIASED-RANDOM 两次。重复这样做,直到两个调用返回不同的值,当这种情况发生时,返回两个位中的第一个:
UNBIASED-RANDOM
while TRUE
do
x ← BIASED-RANDOM
y ← BIASED-RANDOM
if x != y
then return x
要查看 UNBIASED-RANDOM 以 1/2 的概率返回 0 和 1,请观察给定迭代返回 0 的概率是
Pr {x = 0 and y = 1} = (1 − p)p ,
并且给定迭代返回 1 的概率是
Pr {x = 1 and y = 0} = p(1 − p) .
(我们依赖 BIASED-RANDOM 返回的位是独立的。)因此,给定迭代返回 0 的概率等于它返回 1 的概率。由于 UNBIASED-RANDOM 没有其他方法可以返回值,因此它返回0 和 1 各有 1/2 的概率。