一路关于随机数的算法题目
一道关于随机数的算法题目
已知int rand5()返回1-5之间的随机数,每个数出现的概率相等,
求int rand3() ,返回1-3之间的随机数,要求每个数的概率相等。
然后求int rand7(),要求一样每个数的概率相等。
看过不少随机数的算法了,结果这个想了很久还是不会。。。
求大神指点
------解决方案--------------------
1L的显然不靠谱。他的code,每个数的概率肯定是个分母是5幂次的有理数,做不到1/3的。
------解决方案--------------------
刚才那个不好,还这个看看
搞个复杂点的。
int rand3(){
static int val={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
static int pos =0;
int index =rand5()+5*pos-1;
pos++;
if(pos==3)pos=0;
return val[index];
}
int rand7(){
static int val={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
static int pos =0;
int index =rand3()+3*pos-1;
pos++;
if(pos==7)pos=0;
return val[index];
}
这个表不必这么整齐,可以先洗牌再用。
------解决方案--------------------
哪有那么复杂,rand3 直接用rand5,大于3的重新来,rand7先用2次rand5生成1-25,然后1-21对应rand7,其他重新来就ok
------解决方案--------------------
就算是 出现了 4.5 递归循环123还是均等概率
------解决方案--------------------
思路一样
已知int rand5()返回1-5之间的随机数,每个数出现的概率相等,
求int rand3() ,返回1-3之间的随机数,要求每个数的概率相等。
然后求int rand7(),要求一样每个数的概率相等。
看过不少随机数的算法了,结果这个想了很久还是不会。。。
求大神指点
算法
随机数
------解决方案--------------------
1L的显然不靠谱。他的code,每个数的概率肯定是个分母是5幂次的有理数,做不到1/3的。
int rand3()
{
int ret;
do
{
ret = rand5();
}while(ret > 3);
return ret;
}
int rand7()
{
int ret;
do
{
ret = rand5() * 5 + rand5();
}while(ret > 21);
return (ret % 7) + 1;
}
------解决方案--------------------
刚才那个不好,还这个看看
搞个复杂点的。
int rand3(){
static int val={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
static int pos =0;
int index =rand5()+5*pos-1;
pos++;
if(pos==3)pos=0;
return val[index];
}
int rand7(){
static int val={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
static int pos =0;
int index =rand3()+3*pos-1;
pos++;
if(pos==7)pos=0;
return val[index];
}
这个表不必这么整齐,可以先洗牌再用。
------解决方案--------------------
哪有那么复杂,rand3 直接用rand5,大于3的重新来,rand7先用2次rand5生成1-25,然后1-21对应rand7,其他重新来就ok
------解决方案--------------------
就算是 出现了 4.5 递归循环123还是均等概率
------解决方案--------------------
思路一样