我使用的是在网络上找的一个比较简单的随机生成代码,如下:
        private static char[] constant =   
      {   
        '1','2','3','4','5','6','7','8','9','0'
      };
        public static string GenerateRandom(int Length)
        {
            System.Text.StringBuilder newRandom = new System.Text.StringBuilder(10);
            Random rd = new Random();
            for (int i = 0; i < Length; i++)
            {
                newRandom.Append(constant[rd.Next(10)]);
            }
            return newRandom.ToString();
        }        //调用---------------  
        string sj1 = GenerateRandom(10);
        string sj2 = GenerateRandom(10);
        string sj3 = GenerateRandom(10);
        string sj4 = GenerateRandom(10);
        string sj5 = GenerateRandom(10);
        string sj6 = GenerateRandom(10);使用后,发面变量1到6所生成的都是相同的数字,如何不相同?谢谢

解决方案 »

  1.   

    Random rd = new Random(); 用当前的时间作为种子来开始一系列'伪'随机数。如果运行很快,那么构建的Random都具有相同的种子,反复使用同一个种子,就会生成相同的数字系列。 
    Random rd = new Random(); //这句提到外面
      private static char[] constant =  
          {  
            '1','2','3','4','5','6','7','8','9','0' 
          }; 
            public static string GenerateRandom(int Length) 
            { 
                System.Text.StringBuilder newRandom = new System.Text.StringBuilder(10); 
                
                for (int i = 0; i < Length; i++) 
                { 
                    newRandom.Append(constant[rd.Next(10)]); 
                } 
                return newRandom.ToString(); 
            }         //调用---------------  
            string sj1 = GenerateRandom(10); 
            string sj2 = GenerateRandom(10); 
            string sj3 = GenerateRandom(10); 
            string sj4 = GenerateRandom(10); 
            string sj5 = GenerateRandom(10); 
            string sj6 = GenerateRandom(10); 
      

  2.   


    Random rd = new Random(DataTime.Now.Seconds);//使用一个种子即可
      

  3.   

      int iSeed=10;
      Random ro = new Random(10);
      long tick = DateTime.Now.Ticks;
      Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32));
      

  4.   

    static Random rd = new Random(DateTime.Now.Second); //这句提到外面 不仅要使用种子,而且还需要把rd写成static型的,否则public static string GenerateRandom(int Length)中调用的时候会出现错误! 
      

  5.   

    //定义一个Hashtable用于辨别数字不能重复出现
            Hashtable hsNumber;
            //结束处理方法
            private void lblEnd_Click(object sender, EventArgs e)
            {
                //由于lblBegin_Click()方法的时候把i变量的值又所改变了 所以在这里要重新赋值
                i = 0;            //把相应的线程进行停止
                while (true)
                {
                    //异常作用 hsNumber在Add的时候有可能出发一定的异常
                    try
                    {
                        //如果hsNumber在Add的时候 有相同的键值的跳到catch里出发计时器
                        hsNumber.Add(((Label)listLabel[i]).Text, ((Label)listLabel[i]).Text);
                        lblNumberAll.Text += ((Label)listLabel[i]).Text + " ";
                        listLabel.RemoveAt(i);
                        ((Thread)listThread[i]).Abort();
                        listThread.RemoveAt(i);
                        //判断listThread集合变量里的实际元素个数是否没有了  进行相应的停止
                        if (0 == listThread.Count) 
                        {
                            lblBegin.Enabled = true;
                            lblEnd.Enabled = false;
                            hsNumber.Clear();
                            timer.Stop();
                            return;
                        }
                            
                    }
                    catch
                    {
                        if (!timer.Enabled)
                            timer.Start();
                        return;
                    }
                    
                }部分代码  自己研究去!Hashtable利用
      

  6.   

    http://blog.csdn.net/zhoufoxcn/archive/2007/10/24/1842175.aspx
    一种生成不重复数的算法
    在编程中经常遇到一些类似的问题,比如做一个双色球选号软件,其中6个双色球是从1到33之间选出6个数来,这6个数是不能重复的,这个问题就是我们今天要说的生成不重复数算法。
    算法描述如下:从M个数中选出N个数来(0<N<=M),要求N个数之间不能有重复。
    这个问题我以前用J2SE实现过,使用了ArrayList,每次随机在指定范围内选定一个数,然后查看结果集合中是否存在该数,如果存在继续下一轮循环,如果不存在,就将该数保存到结果集合中去。使用这种算法虽然也能实现要求,缺点是判断结果集合中是否存在该数时,需要通过一个循环来判断,这会增加算法运行的时间,虽然时间复杂度为n,但多次重复,还是一笔不小的开销。下面要介绍的算法是,每次随机取出一个数,之后将该数放置到集合的末尾去,这样下次取随机数的时候,只从1到目标集合个数-1个中随机抽取,如此循环,这样就避免了判断在结果集合中判断是否存在相冲突的数的过程。算法代码如下:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
    using System.Management;namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] range = new int[33];
                for (int i = 0; i < 33; i++)//初始化范围集合,从1到33
                {
                    range[i] = i + 1;
                }
                int[] result = CreateNumbers(range, 6);
                for(int i=0;i<result.Length;i++)
                {
                    Console.WriteLine("result[{0}]={1}", i, result[i]);
                }
                Console.ReadKey();
            }
      
            //取出不重复的6个数
        static int[] CreateNumbers(int[] range, int count)
            {
                int[] result = new int[count];
                Random random=new Random();
                int index = 0;
                int temp = 0;
                for (int i = 0; i < count; i++)
                {
                    index=random.Next() % (range.Length-i);
                    result[i] = range[index];
                    //将当前已使用过的数移至集合末尾,并且将末尾原来没有使用的数放到当前位置
                    temp = range[range.Length - 1-i];
                    range[range.Length - 1-i] = range[index];
                    range[index]=temp;
                }
                return result;
            }
           
        }
    }结果如下:
    补充一下,另外一种不使用数组而使用可变集合的办法,这种算法的做法是使用了之后马上从源集合中清除掉(数组是没有办法这么做的),因而也是可以做到生成不重复的随机数的。具体代码如下:
    //取出不重复的6个数
            static List<int> CreateNumbers(List<int> range, int count)
            {
                List<int> result = new List<int>(count);
                Random random = new Random();
                int index=0;
                for (int i = 0; i < count; i++)
                {
                    index=random.Next()%range.Count;
                    result.Add(range[index]);
                    range.RemoveAt(index);
                }
                return result;
            }至于用法,也很简单:
    List<int> range = new List<int>(33);
                for (int i = 0; i < 33; i++)//初始化范围集合,从1到33
                {
                    range.Add(i + 1);
                }
                List<int> result = CreateNumbers(range, 6);
                for (int i = 0; i < result.Count; i++)
                {
                    Console.WriteLine("result[{0}]={1}", i, result[i]);
                }经万次测试,使用数组方法性能比使用List<int>范型集合高1/4。