注意:
本随机数生成器在一秒时间内随机数生成有规律!若因为用此生成器制造随机数所出现的问题,本人概不负责!
本随机数生成器,主要基于时间进行生成,不在同一秒内,随机数的生成完全没有规律;在同一秒内,随机数的生成会有很大的规律可寻。
问题目前修改办法:
- 将输出随机数的随机种子不断进行增加随机数
- 多次循环生成随机数时,增加变量使秒数变化
int lowbit(int x)
{
return x&(-x);
}
int quick_pow(int a,int b,int mod) //with mod
{
int ans=1;
while(b)
{
if(b&1)
{
ans=ans*a%mod;
}
a=a*a%mod;
b>>=1;
}
return ans;
}
int quick_pow(int a,int b) //without mod
{
int ans=1;
while(b)
{
if(b&1)
{
ans=ans*a;
}
a=a*a;
b>>=1;
}
return ans;
}
int Inverse(int a,int p)
{
return quick_pow(a,p-2,p);
}
//begin:rand_function
int getdigit(int x)
{
int cnt=0;
while(x)
{
cnt++;
x/=10;
}
return cnt;
}
bool ischage(int limit)
{
int tim=time(0);
int nexttime=tim+1;
int nnexttime=tim+2;
int ans=tim xor nexttime xor nnexttime;
int res=tim+nexttime+nnexttime;
if(ans>res)
{
ans-=res;
}
int DIGI=ans/2;
if(res%ans<=DIGI) return true;
else return false;
}
int getlimit(int seed,int limit)
{
int ans=-0x3f3f3f3f,res=-0x3f3f3f3f;
for(int i=1;i<=limit;i++)
{
int now=quick_pow(10,i);
int nowres=now%i;
if(res<nowres) res=nowres,ans=i;
else if(res==nowres)
{
if(ischage(res))
{
ans=i;
}else{
//I Love C** 不要管它
}
}
}
return ans;
}
int rand(int seed,int limit)
{
int digit=getdigit(limit);
int userlimit=limit;
limit=getlimit(seed,digit);
int x=time(0);
int nx=x xor seed;
int ny=nx xor seed;
int nz=ny xor nx xor seed;
int lobx=lowbit(nx);
int loby=lowbit(ny);
int lobz=lowbit(nz);
int ssum=lobx+loby+lobz;
ssum=ssum xor seed;
int nexttime=time(0)+1000;
int Inver=Inverse(nexttime,ssum);
for(int i=1;i<=limit;i++)
{
if(i<=nexttime)
{
continue;
}
if(Inver%i==nexttime)
{
return i;
}
}
int ans=Inver+nexttime+ssum;
return ans%userlimit+1;
}
//end:rand_function