.net中的Randome类可以用于获取随机数,但并非真正意义上的随机,缺点有二:

当种子相同时,生成的随机数列一定是相同的,默认用的是当前系统启动后的毫秒数为种子;

生成的随机数列很有可能有重复,也就是所有随机数出现的概率并不完全相同;

比如:

View Code
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()是肯定不会重复的。>
总结:个人认为第二种方法是最好的。 计算机运行效率越来越高,同时运行的可能性很大。时间的操作不确定性很高。

posted on 2013-04-11 15:31  赶路人之刚出发  阅读(652)  评论(0编辑  收藏  举报