等概率输出0和1
题目描述:
有一个随机数发生器,以概率 P 产生0,概率 (1-P) 产生 1,请问能否利用这个随机数发生器,构造出新的发生器,以 1/2 的概率产生 0 和 1 。请写明结论及推理过程。
解题思路:
概率如下:
P ( 1 , 1 ) = p ∗ p
P ( 1 , 0 ) = p ∗ ( 1 − p )
P ( 0 , 1 ) = ( 1 − p ) ∗ p
P ( 0 , 0 ) = ( 1 − p ) ∗ ( 1 − p )
由此可以推出P ( 1 , 0 )和P ( 0 , 1 )概率相等,所以可以利用两次产生0或1的调用,产生概率相等的数。
代码:
package exercises
import (
"math/rand"
"time"
)
func x() int {
// 假设
// 1.返回0概率为p
// 2.返回1概率为1-p
rand.Seed(time.Now().UnixNano())
return int(rand.Int31n(2))
}
func y() int {
for {
a := x()
b := x()
if a == 0 && b == 1 {
return 0
}
if a == 1 && b == 0 {
return 1
}
continue
}
}