一路关于随机数的算法题目

一道关于随机数的算法题目
已知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
------解决方案--------------------
引用:

int rand3()
{
int a = rand5();

if(a == 1)
   return 1;

else if(a == 2)

       return 2;

else if(a == 3)

        return 3;
else
     return rand3();  
}


这个代码也许是对的。



就算是 出现了 4.5 递归循环123还是均等概率
------解决方案--------------------
引用:
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;
}


思路一样