172 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10()随机1~10

2. 已知有个 rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10()随机1~10。

答:
        程序关键是要算出rand10,1到10,十个数字出现的考虑都为10%.根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。怎么从49平均概率的转换为1到10呢?
1.rand7执行两次,出来的数为a1.a2.
2.如果 a1*7+a2<40,==> (a1*7+a2)/4为0-9;则b=(a1*7+a2)/4+1,
  如果a1*7*a2>=40,重复第一步。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std; 

int rand7()   
{ 
	return rand()%7+1;  //1-7
}

int rand10()  
{ 
	int a71,a72,a10; 
	do  
	{
		a71=rand7()-1;//0-6
		a72=rand7()-1;
		a10=a71*7+a72;//0-48 
	} while(a10>=40); 
	return (a71*7+a72)/4+1;//(0-39)/4=(0-9),+1=(1-10)  
}  

int main()
{
	int x,i,a1,a2;
	i=1;
	a1=0;//表示1,2的次数 
	a2=0;
	while(i++<=10000)
	{
		x=rand10();
		if(x==1)
			a1++;
		else if(x==2)
			a2++;
	}
	printf("1的概率为: %lf ,2的概率为: %lf \n",1.0*a1/10000,1.0*a2/10000);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值