为什么一定要Thread.Sleep(时间)之后,才可以正常取得随机字符?否则得到的结果永远是同一个字符?

解决方案 »

  1.   

    to 为什么一定要Thread.Sleep(时间)之后,才可以正常取得随机字符?否则得到的结果永远是同一个字符?你的代码如何写得。
      

  2.   

    生成一个随机数之前别忘了: Randomize; 
    使用前请用Randomize过程初始化
      

  3.   

    for (int i = 0; i < intUserCount; i++)
                                {
                                    Random rnd = new Random();
                                    int l=rnd.Next(0,arrUser.Length);
                                    string s = arrUser[l].ToString();
                                    //如果这里加上Thread.Sleep(x)就可以正常得到。
                                    strAllUser+=s;
                                }
      

  4.   

    Sample code as follows:
    Random rnd = new Random(arrUser.Length);for (int i = 0; i < intUserCount; i++)
    {
    int l=rnd.Next();
    string s = arrUser[l].ToString();
    strAllUser+=s;
    }
      

  5.   


    //生成n位不同的验证码 
    //生成随机数函数中从strchar 数组中随机抽取
    //字母区分大小写
    //参数n为生成随机数的位数,一般取四位
    public static string RandomNum(int n) //
    {
    string strchar = "0,1,2,3,4,5,6,7,8,9" ;
    string[] VcArray = strchar.Split(',') ;
    string  VNum = "" ;//由于字符串很短,就不用StringBuilder了
    int temp = -1 ;    //记录上次随机数值,尽量避免产生几个一样的随机数
    //采用一个简单的算法以保证生成随机数的不同
    Random rand =new Random();
    for ( int i = 1 ; i < n+1 ; i++ ) 
    {    
    if ( temp != -1) 
    {
    rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks));
    }    
    //int t =  rand.Next(35) ;
    int t=rand.Next(10);
    if (temp != -1 && temp == t) 
    {
    return RandomNum( n);  //这里好像是递归
    }
    temp = t  ;
    VNum += VcArray[t];
    }
    return VNum ;//返回生成的随机数
    }
    //生成随机数后,将值赋值给一个Label控件,然后改一下Label背景的颜色,OK了
     // 谢谢阅读! 

    static void Main(string[] args)

    for(int i=0;i<=100;i++)
    {
    Console.WriteLine(RandomNum(10));
    Thread.Sleep(10);
    }
    }好像是有这个问题,去掉Thread.Sleep(10);会有很多重复的难怪我以前点卡生成的时候就有很多密码是重复的,唉,原来是这里出问题了高人怎么解决,帮我改改吧!
      

  6.   

    public static string RandomNum(int n) //
    {
    string strchar = "0,1,2,3,4,5,6,7,8,9" ;
    string[] VcArray = strchar.Split(',') ;
    string VNum = "" ;//由于字符串很短,就不用StringBuilder了
    int temp = -1 ; //记录上次随机数值,尽量避免产生几个一样的随机数
    //采用一个简单的算法以保证生成随机数的不同
    Random rand =new Random(DataTime.Now.Ticks);//Create random object using current ticks
    for ( int i = 0 ; i < n ; i++ )
    {
    VNum += VcArray[rand.Next()%10];
    }
    return VNum ;//返回生成的随机数
    }
      

  7.   

    Random rnd = new Random(1);
    for (int i = 0; i < 10; i++)
    {
    int l=rnd.Next();
    // str1=str1.PadLeft(10,'1'); //无第二参数为加空格 
    Console.WriteLine(l.ToString().PadRight(10,'0'));

    }写了个简单的感觉也比较的随机了
      

  8.   

    Knight94(愚翁) ( ) 信誉:110 大哥还是一样的问题,循环调用就会有好多数据是重复的
      

  9.   

    to Knight94(愚翁)你的代码会索引超出范围
      

  10.   

    to 你的代码会索引超出范围sorry!
    我的问题,把数组长度也能产生随机数了,修改如下即可。
    Random rnd = new Random(arrUser.Length);for (int i = 0; i < intUserCount; i++)
    {
    int l=rnd.Next();
    string s = arrUser[l%arrUser.Length].ToString();
    strAllUser+=s;
    }
      

  11.   

    为什么要用l%arrUser.Length呢?如果使用
    Random rnd=new Random(0,arrUser.Length);
    这样不是已经指定了新随机数产生的范围吗?
      

  12.   

    很简单,你需要做的就是保证每次取随机数,都必须是 同 一 个 Random对象,即使是多线程。因此你应该用全局变量保存Random对象,或者用Singleton模式。
      

  13.   

    to 为什么要用l%arrUser.Length呢?因为指定随机数的范围是0-arrUser.Length,那么会产生的随机数可能等于arrUser.Length,那么用它去作索引,会越界。
      

  14.   

    to Random rnd=new Random(0,arrUser.Length);
    这样不是已经指定了新随机数产生的范围吗?你所问的,脑袋已经说得很清楚,而我的做法也是这个意思。
      

  15.   

    Random rand =new Random(DataTime.Now.Ticks);//Create random object using current ticks
    一次取多个随机数,这种做法是很有问题的,
    .net中,一个种子,只生成一个随机数列。
    当cpu高速运转时,在一个DataTime.Now.Ticks内,可以取多个随机数,这时DataTime.Now.Ticks可能还没有变,生成的随机数当然一样了。一次取多个时,让种子不一样就可以了,再加个判断。
    就比如说弄个static int,让它++做种子,就可以了。