rand5()生成rand7()

来源:互联网 发布:talk是什么软件 编辑:程序博客网 时间:2024/05/22 14:20

   找工作,工作,作,任重而道远快哭了

   看到面筋里面这道题,刚开始是没有任何思路的,后来我就习惯了。

   原始思路:利用rand5()扩展成一个更长的区间,然后映射到7的长度上面。

   想啊想啊,终于还是看了别人的扩展长度的代码

     pr7=5*(rand5()-1)+rand5();
   这个真的很急很关键。

   知道映射到一个均匀的长区间以后,于是想这个区间是1-25(设生成数为y),数据是均匀分布的(这点很重要)
   于是想啊缩放到7这个区间,好几种方式。

   第一种----- 1,2,3映射到1...一次类推。

while(1){   if(pr7>21) pr7=5*(rand5()-1)+rand5();    else{    return (pr7-1)/3+1;}

   第二种-----7,14,21映射为1...一次类推。

while(1){   if(pr7>21) pr7=5*(rand5()-1)+rand5();    else{    return pr7%7+1;}}
  第三种------遇到7以上的不反回,厉害了

while(1){   if(pr7>7) pr7=5*(rand5()-1)+rand5();    else{    return pr7;}}
综合一下代码:

#include<iostream>#include<stdlib.h>using namespace std;int rand5(){return 1+rand()%5;}int rand7(){int pr7=1456;while(1){   if(pr7>7) pr7=5*(rand5()-1)+rand5();    else{    return pr7;}}}int main(){int a,i=70000;int p[7]={0};//while(i){    a=rand7();//p[a-1]++;//i--;//}//for(int j=0;j<7;j++) 测试生成的数据的分布 //   cout<<p[j]<<"\t";    return 0;} 
测试了一下,数据是均匀分布的。


原创粉丝点击