书法字典:https://www.shufadict.com

两道概率题-供大家周末把玩

题目

1.给定一个函数rand5(),该函数能等概率生成1-5之间的整数(包括1和5),如何用该函数等概率生成整数1-7?

解法

本以为很简单,做了以后才发现其实并不简单,这个题难就难在要求是等概率,贴出几个解法,供大家参考

下面代码来自StackOverflow

解法一

代码
int i;
do
{
i
= 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1 and 25
} while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1; // result is now uniformly random between 1 and 7

解法二(更直观一些)

代码
int rand7()
{
int vals[5][5] = {
{
1, 2, 3, 4, 5 },
{
6, 7, 1, 2, 3 },
{
4, 5, 6, 7, 1 },
{
2, 3, 4, 5, 6 },
{
7, 0, 0, 0, 0 }
};

int result = 0;
while (result == 0)
{
int i = rand5();
int j = rand5();
result
= vals[i-1][j-1];
}
return result;
}

2. 一个随机数生成函数f(),只产生数字1和0,生成1的概率是p,生成0的概率是1-p,如何利用该函数等概率生成1和0?(此题来自算法导论一书)

由于p(1-p)和(1-p)p是两个等概率事件,根据这个原理,可得如下代码

int func()
{
int i ;
int j ;
while(true)
{
i
= f() ;
j
= f() ;

if(i == 1 && j == 0)
return 1;
else if(i == 0 && j == 1)
return 0;
}
}

posted on 2010-07-10 18:24  翰墨小生  阅读(4828)  评论(18编辑  收藏  举报

导航

书法字典:https://www.shufadict.com