随机数很简单,C#中的随机数会自动的取时间戳来做为随机因子,但是程序的运行是很快的,一秒钟内可以做很多事的, 这样反而会出现了重复随机数!
当然,用Thread.Sleep(2)来解决问题,很多时候,这个方法是适用的。
但我现在有四万个记录要处理,每个人一天打四次卡,大家算算就会发现,四(万*四)这个时间就太长了!
后来我用了一招把就是把时间戳
...
int randomsheet = uncheck((int)DateTime.Now.Ticks);
Random rd = new Random(randonsheet);
...
随机完后,我手动的加1
...
randomsheet = randomsheet+1;
if(randonsheet==int.MaxValue)
{
int randomsheet = uncheck((int)DateTime.Now.Ticks)
}
...
但是这样经常会出现2到4个随机数出现了连号!
这不行!因为这个随机数用来作打卡时间(分钟部分)的,太有规律这完全不行嘛!
后来我改成了这样:
private string _Random(int imin, int imax, ref int RandomSeet,ref long dtt)
{
if (DateTime.Now.Ticks != dtt)
{
RandomSeet = int.Parse(dtt.ToString().Substring(dtt.ToString().Length - 9));
dtt = DateTime.Now.Ticks;
}
else
{
RandomSeet = RandomSeet+1;
}
if (RandomSeet == int.MaxValue)
{
RandomSeet = int.Parse(dtt.ToString().Substring(dtt.ToString().Length - 9));
}
Random r = new Random(RandomSeet);
int nran = r.Next(imin, imax);
if (nran < 10)
return "0" + nran.ToString();
else
return nran.ToString();
}
因为我发现用unchecked截的数据怪怪的,而时间戳最主要的是分跟秒,所以我手取了后面的9位数。
这样一来随机数有所好转,但是明显还是可以看得出一定的规律来,不同的人打卡时间会有一定的相似!
后来想了想,每次加1,这个数太近了!问题就出在这里,
所以我把加1改成了如下:
if (RandomSeet % 2 == 0)
{
RandomSeet = RandomSeet + 3;
}
else
{
RandomSeet = RandomSeet + 4;
}
终于OK,以前没想过一个好的随机数都这么烦!