对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。一般地,我们使用同系统时间有关的参数作为随机种子,这也是.net Framework中的随机数发生器默认采用的方法。
一、初始化随机数发生器
1、不指定随机种子,系统自动选取当前时间作为随机种子。
Random rd = new Random();
2、指定一个int型参数作为随机种子。
int iSeed = 10;
Random rd = new Random(iSeed);
二、net提供方法
1、Next();
int Random.Next();返回非负随机数
int Random.Next(int maxValue);要生成随机数的上界(随机数不能取该上界值),maxValue必须大于等于0
int Random.Next(int minValue,int maxValue);返回随机数[minValue,maxValue)
2、double Random.NextDouble();返回一个介于0.0 - 1.0 之间的随机数
三、产生不重复的随机数
1、使随机种子不同,来保证不重复
long tick = DateTime.Now.Ticks;
Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32));
这样可以保证99%不是一样。
2、使用一些数据结构和算法
(1)、思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把这个位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,...),将该位置的数用最后的数代替。
(2)、利用Hashtable
(3)、递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已获取的数字有重复就重新随机获取
这些代码都很简单,只提供思想,当然还会有许多更好的方式……