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

quickSort 2013-10-16 09:31:03
已知int rand5()返回1-5之间的随机数,每个数出现的概率相等,
求int rand3() ,返回1-3之间的随机数,要求每个数的概率相等。
然后求int rand7(),要求一样每个数的概率相等。


看过不少随机数的算法了,结果这个想了很久还是不会。。。
求大神指点
...全文
178 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ministarler 2013-10-17
  • 打赏
  • 举报
回复
引用 9 楼 lc10915819 的回复:

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还是均等概率
Ministarler 2013-10-17
  • 打赏
  • 举报
回复

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();	 
}
这个代码也许是对的。
lm_whales 2013-10-17
  • 打赏
  • 举报
回复
更正 static int val={。。。}; 改为 static int val[]={。。。}; 下面这个,可不可以呢。

int rand3(){
	static int pos=0;
	if(pos ==3)pos =0;
	pos++;
	return ((rand5() +(pos - 1) *5 -1)/ 3 + 1; 
}

int rand7(){
	static int pos=0;
	if(pos ==7)pos =0;
	pos++;
	return ((rand5() +(pos - 1) *5 -1)/ 7 + 1; 
}
这样是否更随机一些。
int rand3(){
	static int pos=0;
        staic int a[3]={0,2,1}
	if(pos ==3)pos =0;
	pos++;
	return ((rand5() + a [pos -1]*5 -1)/ 3 + 1; 
}

int rand7(){
	static int pos=0;
        staic int a[3]={0,5,2,6,1,4,3};
	if(pos ==7)pos =0;
	pos++;
	return ((rand5() + a[pos - 1] *5 -1)/ 7 + 1; 
}
nice_cxf 2013-10-17
  • 打赏
  • 举报
回复
哪有那么复杂,rand3 直接用rand5,大于3的重新来,rand7先用2次rand5生成1-25,然后1-21对应rand7,其他重新来就ok
lm_whales 2013-10-17
  • 打赏
  • 举报
回复
刚才那个不好,还这个看看 搞个复杂点的。 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]; } 这个表不必这么整齐,可以先洗牌再用。
lm_whales 2013-10-17
  • 打赏
  • 举报
回复
搞个复杂点的。 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()*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()*pos-1; pos++; if(pos==7)pos=0; return val[index]; } 这个表不必这么整齐,可以先洗牌再用。
FancyMouse 2013-10-17
  • 打赏
  • 举报
回复
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;
}
Ministarler 2013-10-17
  • 打赏
  • 举报
回复
引用 4 楼 FancyMouse 的回复:
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 rand7()
{
int a = rand3();

if (a==1)
{
return rand3();
}
if (a==2)
{
return rand3()+3;
}
if (a==3)
{
if (rand3()==1)
return 7;
else
return rand7();
}
}
quickSort 2013-10-16
  • 打赏
  • 举报
回复
能不能证明下? 感觉概率不相等啊。。。 data=[0-4]和[5-9]和[10-12]等概率相等么?
引用 1 楼 turingo 的回复:
例如:

int rand3(void)
{
	int data = 0;
	int i;

	for(i = 0; i < 3; i++)
		data += rand5() - 1;

	return (data / 5) + 1;
}
[quote=引用 楼主 hello_world_2012 的回复:] 已知int rand5()返回1-5之间的随机数,每个数出现的概率相等, 求int rand3() ,返回1-3之间的随机数,要求每个数的概率相等。 然后求int rand7(),要求一样每个数的概率相等。 看过不少随机数的算法了,结果这个想了很久还是不会。。。 求大神指点
[/quote]
图灵狗 2013-10-16
  • 打赏
  • 举报
回复
例如:

int rand3(void)
{
	int data = 0;
	int i;

	for(i = 0; i < 3; i++)
		data += rand5() - 1;

	return (data / 5) + 1;
}
引用 楼主 hello_world_2012 的回复:
已知int rand5()返回1-5之间的随机数,每个数出现的概率相等, 求int rand3() ,返回1-3之间的随机数,要求每个数的概率相等。 然后求int rand7(),要求一样每个数的概率相等。 看过不少随机数的算法了,结果这个想了很久还是不会。。。 求大神指点

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧