C#生成指定范围内的不重复随机数
C#生成指定范围内的不重复随机数
//Number随机数个数 //minNum随机数下限 //maxNum随机数上限 publicint[]GetRandomArray(intNumber,intminNum,intmaxNum) { intj; int[]b=newint[Number]; Randomr=newRandom(); for(j=0;j<Number;j++) { inti=r.Next(minNum,maxNum+1); intnum=0; for(intk=0;k<j;k++) { if(b[k]==i) { num=num+1; } } if(num==0) { b[j]=i; } else { j=j-1; } } returnb; }
下面来介绍下其他网友的实现方法:
方法1:思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把随机抽取到的位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,...),将该位置的数用最后的数代替。
int[]index=newint[15]; for(inti=0;i<15;i++) index=i; Randomr=newRandom(); //用来保存随机生成的不重复的10个数 int[]result=newint[10]; intsite=15;//设置上限 intid; for(intj=0;j<10;j++) { id=r.Next(1,site-1); //在随机位置取出一个数,保存到结果数组 result[j]=index[id]; //最后一个数复制到当前位置 index[id]=index[site-1]; //位置的上限减少一 site--; }
方法2:利用Hashtable。
Hashtablehashtable=newHashtable(); Randomrm=newRandom(); intRmNum=10; for(inti=0;hashtable.Count<RmNum;i++) { intnValue=rm.Next(100); if(!hashtable.ContainsValue(nValue)&&nValue!=0) { hashtable.Add(nValue,nValue); Console.WriteLine(nValue.ToString()); } }
方法3:递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。
Randomra=newRandom(unchecked((int)DateTime.Now.Ticks)); int[]arrNum=newint[10]; inttmp=0; intminValue=1; intmaxValue=10; for(inti=0;i<10;i++) { tmp=ra.Next(minValue,maxValue);//随机取数 arrNum=getNum(arrNum,tmp,minValue,maxValue,ra);//取出值赋到数组中 } ......... ......... publicintgetNum(int[]arrNum,inttmp,intminValue,intmaxValue,Randomra) { intn=0; while(n<=arrNum.Length-1) { if(arrNum[n]==tmp)//利用循环判断是否有重复 { tmp=ra.Next(minValue,maxValue);//重新随机获取。 getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。 } n++; } returntmp; }
以上所述就是本文的全部内容了,希望大家能够喜欢。