找工作,工作,作,任重而道远。
看到面筋里面这道题,刚开始是没有任何思路的,后来我就习惯了。
原始思路:利用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;
}
测试了一下,数据是均匀分布的。