Board logo

标题: C# 随机数中碰到的问题以及解决方法 [打印本页]

作者: cnangel    时间: 2005-8-24 12:26     标题: C# 随机数中碰到的问题以及解决方法

Written by WALKERLEE|NEATStudio
Date:2005-03-25 02:47 +0800

由于某方面的需要。
需要使用到随机数,所以查询了这方面的资料。
  1. public int getFormatedNumeric(int min , int max)
  2. {
  3.         int num = 0;
  4.         Random ro = new Random(unchecked((int)DateTime.Now.Ticks));
  5.         num = ro.Next(min, max);
  6.         return num;
  7. }
复制代码
Random
表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。
使用与时间相关的默认种子值,初始化 Random 类的新实例。
DateTime.Ticks
获取表示此实例的日期和时间的刻度数。
备注:此属性的值为自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。
unchecked
unchecked 关键字用于控制整型算术运算和转换的溢出检查上下文。它可以按照下列形式用作运算符或语句。
Random.Next (Int32, Int32)
返回一个在(min,max)的指定范围内的随机数。
备注:maxValue 必须大于或等于 minValue。
在实际的运用中,发现如果使用上面写的随机数生成函数同时生成数个随机数时,会出现相同情况。
  1. string s1,s2,s3, s4;
  2.                         
  3. s1 = getFormatedNumeric(0, 9).ToString();
  4. s2 = getFormatedNumeric(0, 9).ToString();
  5. s3 = getFormatedNumeric(0, 9).ToString();
  6. s4 = s1 + s2 + s3;
  7. MessageBox.Show(s4);
复制代码
s1,s2,s3 的值都是一样的。
经过Libra查询手册得出结论:默认随机数是由系统时间生成,在速度很快的机器上会出现相同随机数产生的情况。
根据上面问题,我们对随机数产生函数进行修改。
其中加入静态变量 roCount.
  1. public static int roCount = 0;
  2.                
  3. public int getFormatedNumeric(int min , int max)
  4. {
  5.         int num = 0;
  6.         Random ro = new Random(unchecked(roCount * (int)DateTime.Now.Ticks));
  7.         num = ro.Next(min, max);
  8.         roCount++;
  9.         return num;
  10. }
复制代码
再次执行,发现s1,s2,s3的值已经不相同。目的达到。





欢迎光临 星星博客 (http://commerce.huhoo.net/) Powered by Discuz! 7.0.0