问题标题: 一种随机数生成方式

0
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
吴庞茂旭
吴庞茂旭
资深光能
资深光能

这只是一个生成数的数学函数啊,您只是加上时间**了而已,还不如直接使用时间**来的快。\kkk

我要回答