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

时间:2023-02-20 07:58:26


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);
}

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