【发布时间】:2012-08-25 12:51:41
【问题描述】:
如果我有一个名为 rand1() 的函数生成数字 0(30% 概率)或 1(70% 概率),如何编写一个生成数字 0 或 1 等概率的函数 rand2() 使用 rand1() ?
更新:
最后在Introduction to Algorithms (2nd)这本书上发现了这个问题(我已经买了这本书的中文版),Excercise 5.1-3,原来的问题是:
5.1-3 假设您要以概率 1/2 输出 0,以概率 1/2 输出 1。 您可以使用一个程序 BIASED-RANDOM,它输出 0 或 1。它 以某个概率 p 输出 1,以概率 1− p 输出 0,其中 0
解决方案是: (见: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。
【问题讨论】:
-
不是真正的50/50,而是49/51:你可以用rand1()生成两次,如果都是1,那么你可以分配0;为其他情况分配 1。
-
家庭作业?面试题?
-
今天的面试题,没思路。
-
@JensGustedt - 我不这么认为。
rand()是一个通用函数,不是特定于 C 的。已删除 C 标记。