下面是关于使用C#生成不重复的随机数的完整攻略及示例:
生成不重复的随机数概述
在C#中生成随机数是很常见的需求,但如果要生成不重复的随机数则需要使用一些特殊的技巧。
- 首先,我们需要生成一个可重复的种子值seed。种子值可以用系统时间、Guid、随机数等值生成。可以使用
new Random(seed)
初始化Random对象来进行后续的随机数生成操作。 - 其次,我们需要考虑如何保证生成的随机数不重复。常见的方法是使用集合类型来存储已经生成的随机数,然后在生成新随机数时判断是否已经存在于集合中。
下面是示例代码:
生成Guid作为种子值
public static class RandomHelper
{
private static Random _random;
static RandomHelper()
{
_random = new Random(Guid.NewGuid().GetHashCode());
}
public static int Next(int minValue, int maxValue)
{
return _random.Next(minValue, maxValue);
}
public static int[] GetDistinctRandomNumbers(int count, int minValue, int maxValue)
{
if (count > maxValue - minValue)
{
throw new ArgumentException("count cannot be greater than the range");
}
var list = new List<int>();
while (list.Count < count)
{
int number = Next(minValue, maxValue);
if (!list.Contains(number))
{
list.Add(number);
}
}
return list.ToArray();
}
}
在上面的示例代码中,我们使用Guid生成一个种子值并初始化Random对象。在方法GetDistinctRandomNumbers
中,我们首先进行参数校验,然后循环生成随机数并存入集合中,如果已经存在集合中则跳过。最后返回集合中的结果。
下面是使用示例:
int[] numbers = RandomHelper.GetDistinctRandomNumbers(10, 1, 100);
上面的代码生成10个介于1到100之间的不重复的随机数。
使用Fisher-Yates洗牌算法
另一种生成不重复随机数的方法是使用Fisher-Yates洗牌算法。该算法将数组中的元素随机交换位置,可以生成不重复的随机数序列。
public static class RandomHelper
{
private static Random _random;
static RandomHelper()
{
_random = new Random();
}
public static int Next(int minValue, int maxValue)
{
return _random.Next(minValue, maxValue);
}
public static int[] GetDistinctRandomNumbers(int count, int minValue, int maxValue)
{
if (count > maxValue - minValue)
{
throw new ArgumentException("count cannot be greater than the range");
}
var numbers = Enumerable.Range(minValue, maxValue - minValue + 1).ToArray();
var result = new int[count];
for (int i = 0; i < count; i++)
{
int j = Next(i, numbers.Length);
result[i] = numbers[j];
numbers[j] = numbers[i];
}
return result;
}
}
在上面的示例代码中,我们首先使用Enumerable.Range
生成一个从minValue到maxValue的整数数组。然后使用循环和交换操作生成随机数序列。
下面是使用示例:
int[] numbers = RandomHelper.GetDistinctRandomNumbers(10, 1, 100);
上面的代码生成10个介于1到100之间的不重复的随机数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用C#生成不重复的随机数的代码 - Python技术站