C#生成不重复随机数组
这里主要是总结别人的方法,以备不时之需。
利用提高随机种子进行随机生成
1234567891011121314151617for (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);}利用Hashtable
123456789101112Hashtable 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());}}使用Guid类生成随机数。还没弄清楚之前不推荐,测试结果并不好
12345678910public 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;}递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取,测试还是有重复。
12345678910111213141516171819202122232425Random 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;}以产生100以内不重复的随机数为例,可以考虑先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,…),将该位置的数与最后一个位置的数对调就可以了。
123456789101112131415161718192021222324252627public 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