生成不重复随机数组

C#生成不重复随机数组

这里主要是总结别人的方法,以备不时之需。

  1. 利用提高随机种子进行随机生成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    for (int i = 0; i < 5; i++)
    {
    Random r = new Random(int.Parse(DateTime.Now.ToString("HHmmssfff")) + i);
    int num = r.Next(0, 1000);//随机生成一个整数
    string tempStr = string.Empty;
    for (int j = 0; j < 4; j++)
    {
    r = new Random(int.Parse(DateTime.Now.ToString("HHmmssfff")) + i + j);
    int x = r.Next(65, 90);//65-90代表A-Z的ASCII值
    char a = (char)x;
    tempStr += a.ToString();
    }
    Console.WriteLine("num" + i.ToString() + "的值是:" + num);
    Console.WriteLine("tempStr" + i.ToString() + "的值是:" + tempStr);
    }
  2. 利用Hashtable

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Hashtable hashtable = new Hashtable();
    Random rm = new Random();
    int RmNum = 10;
    for (int i = 0; hashtable.Count < RmNum; i++)
    {
    int nValue = rm.Next(100);
    if (!hashtable.ContainsValue(nValue) && nValue != 0)
    {
    hashtable.Add(nValue, nValue);
    Console.WriteLine(nValue.ToString());
    }
    }
  3. 使用Guid类生成随机数。还没弄清楚之前不推荐,测试结果并不好

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static int GetRandomNumber(int min, int max)
    {
    int rtn = 0;
    Random r = new Random();
    byte[] buffer = Guid.NewGuid().ToByteArray();
    int iSeed = BitConverter.ToInt32(buffer, 0);
    r = new Random(iSeed);
    rtn = r.Next(min, max + 1);
    return rtn;
    }
  4. 递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取,测试还是有重复。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
    int[] arrNum=new int[10];
    int tmp=0;
    int minValue=1;
    int maxValue=10;
    for (int i=0;i<10;i++)
    {
      tmp=ra.Next(minValue,maxValue); //随机取数
      arrNum[i]=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值赋到数组中
    }
    public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra)
    {
      int n=0;
      while (n<=arrNum.Length-1)
      {
        if (arrNum[n]==tmp) //利用循环判断是否有重复
        {
          tmp=ra.Next(minValue,maxValue); //重新随机获取。
          getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
        }
      n++;
      }
      return tmp;
    }
  5. 以产生100以内不重复的随机数为例,可以考虑先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,…),将该位置的数与最后一个位置的数对调就可以了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public static int[] GetRandomArray(int Number, int minNum, int maxNum)
    {
    int j;
    int[] b = new int[Number];
    Random r = new Random();
    for (j = 0; j < Number; j++)
    {
    int i = r.Next(minNum, maxNum);
    int num = 0;
    for (int k = 0; k <j;k++)
    {
    if (b[k] == i)
    {
    num = num + 1;
    }
    }
    if (num == 0)
    {
    b[j] = i;
    }
    else
    {
    j = j - 1;
    }
    }
    return b;
    }

网上说当注重效率时,也可以使用字典,方法很多。Guid类这个还需要进一步研究了。

参考链接: http://www.cnblogs.com/programsky/p/5408697.html
http://www.jb51.net/article/66255.htm
http://www.cnblogs.com/AmatVictorialCuram/p/5426936.html
http://www.cnblogs.com/falla/archive/2010/01/29/1659399.html
http://www.manew.com/2843.html
http://bbs.csdn.net/topics/392005427?page=1
一个伪随机数生成算法:http://blog.csdn.net/yangsh3002/article/details/6180922

坚持原创技术分享,您的支持将鼓励我继续创作!