C# Random生成随机数与相同随机数解决办法

作者:袖梨 2022-06-25

第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:

 代码如下 复制代码

Random ro = new Random();

第二种方法可以指定一个int型参数作为随机种子:

 代码如下 复制代码

int iSeed=10;
Random ro = new Random(10);
long tick = DateTime.Now.Ticks;
Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32));

这样可以保证99%不是一样。


时间短重复

2.利用种子生成不重复随机数

(a)生成随机数时:Random ran = new Random((int)DateTime.Now.Ticks);

 代码如下 复制代码

ran .Next(minvale, maxvale);

可以有效解决重复问题

PS: DateTime.Now.Ticks 为数据数的计时周期数

(b) Random random = new Random( GetRandomSeed( ) );//使用加密服务提供程序 (CSP) 提供的实现来实现加密随机数生成器 (RNG) s

 代码如下 复制代码

tatic int GetRandomSeed( ) {

byte[] bytes = new byte[4];

System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider( ); rng.GetBytes( bytes );

return BitConverter.ToInt32( bytes , 0 );

}

或者 Random sourceGen = new Random(new Guid().GetHashCode());//利用Guid

3.利用延时运行时间解决重复问题

Thread.Sleep(100);

4.递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。

 代码如下 复制代码

  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=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;
}

其它一些参考

1: 返回一个共有n位数,其中m位是小数的随机数

 代码如下 复制代码


--------------------------------------------------------------------------------

function randomXiao(n,m){
var a = Math.pow(10, n+m);
var b = random(a);
return b=b/Math.pow(10, m);
}


 

--------------------------------------------------------------------------------

可以用trace(randomXiao(3,2));实验一下。这个函数 简单。Math.pow(n,m)用于返回一个以n为底,m为指数的数。乘方!

# 2: 返回一个n到m之间的随机数

 

 代码如下 复制代码

 


--------------------------------------------------------------------------------

function randomNm(n,m){
if(m>=n){
return random(m-n+1)+n;
}
else {
return false;
}
}


--------------------------------------------------------------------------------

之所以用random(m-n+1)是因为随机数的范围是m-n,加上1使 得m也能在里面。加上n保证随机数以n为下限。
加上判断使函数更完整。另外,如果要返回一个负数随机数,也可以用randomNm(n,0);当 然,我想更一般的是用-random(n);

# 3: 返回一个字母

 

 代码如下 复制代码

 


--------------------------------------------------------------------------------

function randomAscii(){
var c = String.fromCharCode(random(26)+65);
if(random(2)){
return c.toLowerCase();
}
return c;
}


--------------------------------------------------------------------------------

 

#4: 返回一个不区分大小写的随机字母

如果要返回大写,把if条件句去掉就行了。如果要返回小写,可以把条件句改为恒成立,或者 去掉条件,最后一句改为:
return c.toLowerCase(); String.fromCharCode(number)函数返回number代表数字的ASCII码。
toLowerCase()用于将大写字 母转为小写。

# 5: 返回一个n到m之间的k个互异随机数

 代码如下 复制代码


function randomKdiffer(n,m,k){
arrayK = [];
var i = 0;
while (i < k) {
a = random(m-n+1)+n;
for (var j = 0; j < i; j++) {
if (a == arrayK[j]) {
break;
}
}
if (j == i) {
arrayK[i] = a;
i++;
}
}
return arrayK;
}

相关文章

精彩推荐