C#为什么产生的随机数重复与生成不重复随机数
在程序开发过中,有时生成的随机数怎么也不重复,而有时产生的全是重复的随机数,为什么会出现这种情况?比较生成重复与不重复随机数的情况可以发现,生成重复随机数常常出现在循环中,其它情况很少会出现随机数重复。从这里可以发现,两次产生随机数时间间隔比较短就会产生重复的随机数,循环一般执行都非常快(用毫秒表示,数值都十分小)。这给我们一个启示,平常不产生重复随机数的程序在用户两次访问间隔很小的情况下,可能会产生重复随机数,从而导致程序执行错误,这种错误是潜在错误并且很不容易被发现,所以说软件的错误总是检测不完。
经过上面的比较分析,想必您对为什么产生的随机数重复已略知一二,接下来我们就对它作一个总结,然后再用代码实例说明如何才能生成不重复的随机数。
一、C#随机数重复的原因
上面用在循环中产生随机的例子说明了两次产生随机数的时间间隔比较短时,就会产生重复随机数,这又是为什么呢?弄清楚这个问题,也就明白了为什么产生重复随机数,原来两次生成随机数时间间隔很短时,C#来不急生成种子,所以产生的随机数都用一个种子,于是出现了重复随机数。
二、C#不重复随机数生成的方法
既然是由于间隔时间太短来不急产生种子,我们可以为它生成一个种子,这样就不会产生重复随机数了,代码如下:
using System.Security.Cryptography;
/// <summary>
/// C#不重复随机数的生成
/// </summary>
/// <param name="min">生成随机数最小值</param>
/// <param name="max">生成随机数最大值</param>
/// <returns>生成的随机数</returns>
public static int GetRandom(int min, int max)
{
Random ran = new Random(GetRandomSeed());
return ran.Next(min, max);
}
/// <summary>
/// 生成随机数种子
/// </summary>
/// <returns>种子</returns>
private static int GetRandomSeed()
{
byte[] bytes = new byte[4];
RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
rngCsp.GetBytes(bytes);
return BitConverter.ToInt32(bytes, 0);
}
调用方法:
for (int j = 0; j < 10; j++)
{
Response.Write("<br />" + GetRandom(100, 1000));
}
输出结果:
174
665
761
340
736
912
292
421
943
745
还有一种不重复随机数生成的方法,就是用线程的 sleep() 方法每隔15毫秒生成一个随机数,也不会产生重复的随机数,如果对效率要求不高可以采用。