0
已解决
汪恺恒
中级启示者
中级启示者
提供一种奇怪的随机数生成方式
#include<ctime>
#include<map>
#include<iostream>
using namespace std;
namespace GenHelper{
unsigned z1,z2,z3,z4,b;
unsigned rand_(){
b=((z1<<6)^z1)>>13;
z1=((z1&426767294U)<<18)^b;
b=((z2<<2)^z2)>>27;
z2=((z2&42967667288U)<<2)^b;
b=((z3<<13)^z3)>>21;
z3=((z3&4294157288U)<<7)^b;
b=((z4<<3)^z4)>>12;
z4=((z4&42949679868U)<<13)^b;
return (z1^z2^z3^z4);
}
}
void Srand(unsigned x){
using namespace GenHelper;
z1=x,z2=(~x)^0x233333333U,z3=x^0x1234558766U,z4=(~x)+51;
}
int Rand(){
using namespace GenHelper;
int a=rand_()&32767;
int b=rand_()&32767;
return a*32768+b;
}
int main(){
Srand(time(NULL)); //设置随机数种子
cout<<Rand(); //获得随机数
return 0;
}
随机度测试
#include<ctime>
#include<map>
#include<iostream>
using namespace std;
namespace GenHelper{
unsigned z1,z2,z3,z4,b;
unsigned rand_(){
b=((z1<<6)^z1)>>13;
z1=((z1&426767294U)<<18)^b;
b=((z2<<2)^z2)>>27;
z2=((z2&42967667288U)<<2)^b;
b=((z3<<13)^z3)>>21;
z3=((z3&4294157288U)<<7)^b;
b=((z4<<3)^z4)>>12;
z4=((z4&42949679868U)<<13)^b;
return (z1^z2^z3^z4);
}
}
void Srand(unsigned x){
using namespace GenHelper;
z1=x,z2=(~x)^0x233333333U,z3=x^0x1234558766U,z4=(~x)+51;
}
int Rand(){
using namespace GenHelper;
int a=rand_()&32767;
int b=rand_()&32767;
return a*32768+b;
}
map<int,bool> m;
int sum;
int main(){
Srand(time(NULL));
int t=10; //多次测试
while(t--){
m.clear();
for(int i=1;;i++){
int x=Rand();
if(m[x]==true){
cout<<i-1<<endl; //前i-1个数没有出现重复
sum+=i-1;
break;
}
m[x]=true;
}
}
cout<<"平均值: "<<sum/10;
return 0;
}
输出结果
0
0
0
0
0
0