C#中生成不重复的随机数要求:在0--9这10位数字中取出4位数字出来组成50个四位数但要这50个四位数不能有重复的

解决方案 »

  1.   

    什么0-9中取出来就是生成50个4位10进制数,对吧??
    不考虑效率用这个方法:
    Dictionary<int,int> values;
    每生成一个执行如下操作:
    假如生成的随机数中k;
    if(values.ContainsKey(k))
    {
      //continue.
    }
    else
    {
        values.Add(k,k);
    }
      

  2.   

    HOHO:VS2008编译通过。在2005下应该没问题,没用到2008的新语法。            int k = 0;   //本轮生成随机数
                int c = 0;   //生成计数
                Dictionary<int, int> values = new Dictionary<int, int>();
                Random r = new Random();
                while (c < 50)
                {
                    k = r.Next(1000, 9999);
                    if (values.ContainsKey(k))
                    {
                        continue;
                    }
                    else
                    {
                        values.Add(k, k);
                        c++;
                    }
                }
                foreach (var t in values)
                {
                    Console.WriteLine(t.Value.ToString());
                }
      

  3.   


    /// <summary>
    /// 获取随机字符串根据guid生成
    /// </summary>
    /// <param name="len">不能大于36</param>
    /// <returns></returns>
    public static string GetGuidRandom(int len)
    {
    string strSep = ",";
    string strChar = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,-";
    string intChar = "0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6";
    char[] chrSep = strSep.ToCharArray(); 
    char[] intSep = strSep.ToCharArray(); 
    string[] aryChar = strChar.Split(chrSep, strChar.Length);
    string[] aryInt = intChar.Split(intSep, intChar.Length);
    string guid = System.Guid.NewGuid().ToString();
    for(int i =0;i<aryChar.Length;i++)
    {
    guid=guid.Replace(aryChar[i],aryInt[i]);
    }
    return guid.Substring(0,len);
    }
    这个是根据GUID来生成的,理论上出现重复的概率很小,为了确保万无一失,生成50个随机数之后最好比对一下,50个数字比对时间复杂度不大,当然你也可以不做这个处理.
      

  4.   


    public string RandomNum(int n)
        {
            string strchar = "0,1,2,3,4,5,6,7,8,9";
            string[] VcArray = strchar.Split(',');
            string VNum = "";
            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(10);
                if (temp != -1 && temp == t)
                {
                    return RandomNum(n);
                }
                temp = t;
                VNum += VcArray[t];
            }
            return VNum;
        }
      

  5.   

    在编程中经常遇到一些类似的问题,比如做一个双色球选号软件,其中6个双色球是从1到33之间选出6个数来,这6个数是不能重复的,这个问题就是我们今天要说的生成不重复数算法。算法描述如下:从M个数中选出N个数来(0<N<=M),要求N个数之间不能有重复。这个问题我以前用J2SE实现过,使用了ArrayList,每次随机在指定范围内选定一个数,然后查看结果集合中是否存在该数,如果存在继续下一轮循环,如果不存在,就将该数保存到结果集合中去。使用这种算法虽然也能实现要求,缺点是判断结果集合中是否存在该数时,需要通过一个循环来判断,这会增加算法运行的时间,虽然时间复杂度为n,但多次重复,还是一笔不小的开销。下面要介绍的算法是,每次随机取出一个数,之后将该数放置到集合的末尾去,这样下次取随机数的时候,只从1到目标集合个数-1个中随机抽取,如此循环,这样就避免了判断在结果集合中判断是否存在相冲突的数的过程。 
    http://blog.csdn.net/zhoufoxcn/archive/2007/10/24/1842175.aspx