注意:

本随机数生成器在一秒时间内随机数生成有规律!若因为用此生成器制造随机数所出现的问题,本人概不负责!


本随机数生成器,主要基于时间进行生成,不在同一秒内,随机数的生成完全没有规律;在同一秒内,随机数的生成会有很大的规律可寻。


问题目前修改办法:

  1. 将输出随机数的随机种子不断进行增加随机数
  2. 多次循环生成随机数时,增加变量使秒数变化
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

更多推荐

伪随机数生成器