狂野都城

一壶浊酒喜相逢,古今多少事, 都付笑谈中。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C# 随机数中碰到的问题以及解决方法

Posted on 2005-12-28 13:19  狂野都城  阅读(3956)  评论(1)    收藏  举报
由于某方面的需要。
需要使用到随机数,所以查询了这方面的资料。

public int getFormatedNumeric(int min , int max)
{
        
int num = 0;
        Random ro 
= new Random(unchecked((int)DateTime.Now.Ticks));
        num 
= ro.Next(min, max);
        
return num;
}


CODE:
[b]Random[/b]
表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。
使用与时间相关的默认种子值,初始化 Random 类的新实例。
CODE:
[b]DateTime.Ticks[/b]
获取表示此实例的日期和时间的刻度数。
备注:此属性的值为自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。


CODE:
[b]unchecked[/b]
unchecked 关键字用于控制整型算术运算和转换的溢出检查上下文。它可以按照下列形式用作运算符或语句。


CODE:
[b]Random.Next (Int32, Int32)[/b]
返回一个在(min,max)的指定范围内的随机数。
备注:maxValue 必须大于或等于 minValue。
在实际的运用中,发现如果使用上面写的随机数生成函数同时生成数个随机数时,会出现相同情况。

CODE:
string s1,s2,s3, s4;
                       
s1 = getFormatedNumeric(0, 9).ToString();
s2 = getFormatedNumeric(0, 9).ToString();
s3 = getFormatedNumeric(0, 9).ToString();
s4 = s1 + s2 + s3;

MessageBox.Show(s4);
s1,s2,s3 的值都是一样的。

经过Libra查询手册得出结论:默认随机数是由系统时间生成,在速度很快的机器上会出现相同随机数产生的情况。

根据上面问题,我们对随机数产生函数进行修改。
其中加入静态变量 roCount.

CODE:


 
public static int roCount = 0;
                
public int getFormatedNumeric(int min , int max)
{
        
int num = 0;
        Random ro 
= new Random(unchecked(roCount * (int)DateTime.Now.Ticks));
        num 
= ro.Next(min, max);
        roCount
++;
        
return num;
}


  再次执行,发现s1,s2,s3的值已经不相同。目的达到。

 发现上次贴的上传类,如果计算机快的话,可能因为上传生成的文件名相同,覆盖同一文件,因此,在文件名后面加多一个随机数,比较好些!


修改该函数:

private string GetUploadFileName()
        
{
            
string Result = "";
            DateTime time 
= DateTime.Now;   
            Result 
+= time.Year.ToString() + FormatNum(time.Month.ToString(),2+ FormatNum(time.Day.ToString(),2+ FormatNum(time.Hour.ToString(),2+ FormatNum(time.Minute.ToString(),2+ FormatNum(time.Second.ToString(),2)  + FormatNum(time.Millisecond.ToString(),3)+FormatNum(getFormatedNumeric(0,1000).ToString(),3) ;
            
return(Result);
        }