C#产生指定范围随机数(整数、小数、字符、布尔,相对不重复的和唯一的)的几种方法
在C#中,一般都用Random产生随机数,它可任意指定产生随机数范围。Random结合数组,可以产生一些特殊范围的随机数,以满足特殊的需要。如果在循环中产生随机数,由于间隔时间短,每次产生的随机数都一样,需要先生成种子(有3种方法),再用该种子产生随机数,或者锁住Random对象,这样才能减少产生随机数的重复率。如果要产生唯一的随机数(有4种方法),需要用数组或检查已产生随机数是否重复的办法。
一、用Random产生指定范围随机数(整数随机数)1、产生指定上限的随机数(如产生100以内的随机数)
Randomran=newRandom();intn=ran.Next(100);2、产生指定上下限的随机数(如产生100到1000的随机数)
Randomran=newRandom();intn=ran.Next(100,1000);二、用Random结合数组产生指定范围随机数(字符和布尔随机数)在某些情况下,随机数只能取一些特殊指定的值,如不连续的数字或指定的一些单词等,此时仅用Random无法达到要求,必须借住数组才能实现。实现思路大概是这样:先把这些特殊的值存到数组中,然后把数组的长度作为Random的上限产生随机数,此随机数正是数组的下标,根据该下标取得数组的值。
(一)产生字符随机数1、产生不连续或指定值的随机数
publicstringGetRandom(string[]arr){Randomran=newRandom();intn=ran.Next(arr.Length-1);returnarr[n];}//调用方法:string[]arr={"25","28","30","50","60"};GetRandom(arr);2、生成保留指定小数位数(例如2位)的随机数
假如要用指定单词作为随机数的取值,代码实现跟上例相同,所不同的仅是随机数的取值,所以只要定义一个单词数组直接调用上面代码即可。调用方法:
string[]arr={"red","green","blue","orange","white"};GetRandom(arr);(二)产生布尔随机数publicboolGenerateBoolRandom(){bool[]arr={true,false};Randomran=newRandom();returnarr[ran.Next(2)];}//调用方法:Response.Write(GenerateBoolRandom());//结果true三、用Random产生小数随机数在默认情况下,C#只能产生任意小数随机数,如果要产生指定范围小数随机数,需要自己写代码。写代码时,既可以把它们封装到一个方法中又可以封装到一个类中,后者可重载C#的NextDouble()方法。
1、把代码封装到一个方法
A、生成小数随机数
publicdoubleNextDouble(Randomran,doubleminValue,doublemaxValue){returnran.NextDouble()*(maxValue-minValue)+minValue;}//调用:Randomran=newRandom();doublerandNum=NextDouble(ran,1.52,2.65);Response.Write(randNum);//结果2.30927768119112B、生成保留指定小数位数(例如2位)的随机数
publicdoubleNextDouble(Randomran,doubleminValue,doublemaxValue,intdecimalPlace){doublerandNum=ran.NextDouble()*(maxValue-minValue)+minValue;returnConvert.ToDouble(randNum.ToString("f"+decimalPlace));}//调用:Randomran=newRandom();doublerandNum=NextDouble(ran,5.16,8.68,2);//保留两位小数Response.Write(randNum);//结果8.462、把代码封装到一个类
usingSystem;usingSystem.Text;publicstaticclassRandomDoubleRange{publicstaticdoubleNextDouble(thisRandomran,doubleminValue,doublemaxValue){returnran.NextDouble()*(maxValue-minValue)+minValue;}publicstaticdoubleNextDouble(thisRandomran,doubleminValue,doublemaxValue,intdecimalPlace){doublerandNum=ran.NextDouble()*(maxValue-minValue)+minValue;returnConvert.ToDouble(randNum.ToString("f"+decimalPlace));}}//调用:Randomran=newRandom();doublerandNum1=ran.NextDouble(5.16,8.68);doublerandNum2=ran.NextDouble(5.16,8.68,2);//保留两位小数Response.Write(randNum1+";"+randNum2);//结果7.41055195257559;6.69四、产生相对不重复的随机数当在一个循环中生成随机数,由于生成随机数的时间间隔比较短,容易产生重复的随机数,如果要产生不重复的随机数,需要用种子或把随机数对象锁住,以下是它们的实现方法。
1、用种子产生相对不重复的随机数
生成种子方法一:
publicstaticintGenerateRandomSeed(){return(int)DateTime.Now.Ticks;}//产生1到10的随机数为:2,5,2,5,7,3,4,4,6,3生成种子方法二:
usingSystem.Text.RegularExpressions;publicstaticintGenerateRandomSeed(){returnConvert.ToInt32(Regex.Match(Guid.NewGuid().ToString(),@"d+").Value);}//产生1到10的随机数为:1,7,4,9,8,1,8,7,9,8生成种子方法三:
usingSystem.Security.Cryptography;publicstaticintGenerateRandomSeed(){byte[]bytes=newbyte[4];RNGCryptoServiceProviderrngCSP=newRNGCryptoServiceProvider();rngCSP.GetBytes(bytes);returnBitConverter.ToInt32(bytes,0);}//产生1到10的随机数为:4,8,7,2,6,7,6,5,5,7产生指定数目的随机数并存到数组:
//randNum为产生随机数的数目publicint[]GenerateRandom(intminValue,intmaxValue,intrandNum){Randomran=newRandom(GenerateRandomSeed());int[]arr=newint[randNum];for(inti=0;i