让我详细讲解一下 "c# Random快速连续产生相同随机数的解决方案"。
背景
在编写 C# 相关程序过程中,我们通常需要用到Random类来生成随机数。但是,有时候我们可能会碰到连续生成相同的随机数的情况,这显然是不符合我们的期望的。
解决方案
解决这个问题的方法有很多种,下面我将介绍两种比较常用的方法。
1. 添加随机种子
我们可以为 Random 类添加一个种子,使其生成的随机数更随机。在初始化 Random 实例时,可以提供一个种子值。生成相同的随机数序列的要求就是种子值必须相同。
var random = new Random(DateTime.Now.Millisecond);
在这个例子中,我们使用的种子是当前时间的毫秒数。这个种子是不稳定的,每次运行程序得到的都不同。因此,每次运行程序,都会得到不同的随机数序列。
2. 手动生成随机数序列
如果我们需要尽可能地避免生成相同的随机数序列,我们可以手动生成随机数序列,并将它们存储在数组中。
// 生成不重复的随机数序列
var random = new Random();
var numbers = Enumerable.Range(0, 100).OrderBy(x => random.Next()).ToArray();
这个例子中,我们生成了一个长度为 100 的随机数序列,每个数字都是从 0 到 99 的不同数字。我们使用 OrderBy
函数,并在其中传入一个 Lambda 表达式,让其按照随机数的顺序排序。这个 Lambda 表达式内部调用了 random.Next()
方法,来生成一个随机数。这样,得到的数字序列中,每个数字都是随机的,并且不会重复。
3. 利用 RNGCryptoServiceProvider 类生成新的随机种子
在使用大数据量的随机数时,为了保证随机性,在. NET Framework的完全管理代码中,可以使用RNGCryptoServiceProvider类来提供随机数的生成服务,这个类不需要随机种子。每个随机数都是由随机数生成器生成的,因此您可以随时调用它来生成随机数。 示例代码如下:
private RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
public int Next(int minValue, int maxValue)
{
byte[] uintBuffer = new byte[4];
if (minValue > maxValue)
{
throw new ArgumentOutOfRangeException(nameof(minValue), "Min value cannot be greater than max value.");
}
long diff = maxValue - minValue;
if (diff <= uint.MaxValue)
{
uint upperBound = (uint)((uint.MaxValue / diff) * diff);
while (true)
{
rngCsp.GetBytes(uintBuffer);
uint rand = BitConverter.ToUInt32(uintBuffer, 0);
if (rand < upperBound)
{
return (int)(minValue + (rand % diff));
}
}
}
else
{
ulong upperBound = (ulong)(long.MaxValue / diff) * diff;
while (true)
{
rngCsp.GetBytes(uintBuffer);
uint rand = BitConverter.ToUInt32(uintBuffer, 0);
if (rand < upperBound)
{
return (int)(minValue + (rand % diff));
}
}
}
}
在这个例子中,我们定义了一个 RNGCryptoServiceProvider
对象,并将其保存在一个私有字段 rngCsp
中。在 Next
函数的实现中,我们用随机字节填充一个字节数组,然后使用 BitConverter.ToUInt32
函数将其转换为 uint
类型的随机数。最后,我们返回了一个介于 minValue
和 maxValue
之间的随机数。
总结
本文介绍了两种避免连续生成相同随机数的方法,分别是添加随机种子和手动生成随机数序列。此外,本文还介绍了在使用大数据量随机数时,利用 RNGCryptoServiceProvider 可以生成完全自由随机数的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# Random快速连续产生相同随机数的解决方案 - Python技术站