.net中的Randome类可以用于获取随机数,但并非真正意义上的随机,缺点有二:
当种子相同时,生成的随机数列一定是相同的,默认用的是当前系统启动后的毫秒数为种子;
生成的随机数列很有可能有重复,也就是所有随机数出现的概率并不完全相同;
比如:
Random mr = new Random(10); for (int s = 0; s < 10; s++) { Console.WriteLine(mr.Next(10)); } Console.WriteLine("-----"); mr = new Random(10); for (int s = 0; s < 10; s++) { Console.WriteLine(mr.Next(10)); }
执行结果为:
为避免以上两个问题,有如下几种方案:
1、
Random 类是根据CPU的时钟来产生随机数,如果间隔时间太短有时是会产生相同的随机数,
可以通过暂停下Thread.sleep(6);
2、
可以通过设置一个List列表,判断,如果已经有这个数字,则重新生成;否则,添加到List中
private List<int> GetRndCode(int codeLength)
{
List<int> rndLst = new List<int>();
int temp = 0;
int chr=0;
Random rnd = new Random();
while (temp < codeLength)
{
chr = rnd.Next(100);
if (!rndLst.Contains(chr))
{
temp++;
rndLst.Add(chr);
}
}
return rndLst;
}
有可能会耗时很长。是否会死循环。不确定。
3、如果有一定的时间间隔的话,也可以通过使用Random rd = new Random(DateTime.Now.Millisecond)来达到随机数的目的。
4、网络上有人提议用:Random rd = new Random(Guid.NewGuid().GetHashCode()) 说是可以生成不重复的随机数。<不能确定是否正确,但是NewGuid()是肯定不会重复的。>
总结:个人认为第二种方法是最好的。 计算机运行效率越来越高,同时运行的可能性很大。时间的操作不确定性很高。