用C#生成不重复的随机数的代码

下面是关于使用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技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C#简单邮件群发通用类

    首先我们需要明确什么是C#邮件群发通用类。它是一种在C#编程语言下编写的针对邮件群发的通用类,可以基于.NET Framework的邮件类库(如SmtpClient)来快速发送“批量邮件”。下面是介绍如何编写和使用C#简单邮件群发通用类的步骤: 编写邮件群发通用类 1. 创建C#项目 在Visual Studio中创建一个新的控制台应用程序,我们将在该项目下…

    C# 2023年6月1日
    00
  • C#中常量和只读变量的区别小结

    下面是详细的讲解“C#中常量和只读变量的区别小结”的完整攻略: 常量和只读变量的区别 在C#中,常量和只读变量都用来表示一些固定不变的值,但它们之间有明显的区别。 常量 常量在定义后就无法再次被修改。常量的值必须在编译时确定。常量使用const关键字来定义,如下所示: const int MaxValue = 100; 常量的名称必须以大写字母开头。在使用常…

    C# 2023年6月7日
    00
  • ASP.NET 返回随机数实现代码

    ASP.NET 返回随机数实现代码的完整攻略如下: 1. 生成随机数 可以使用 Random 类来生成伪随机数。在 ASP.NET 中,可以使用以下代码来生成一个介于 0 到 10 之间的随机整数: Random rand = new Random(); int randomNumber = rand.Next(0, 11); 这里,我们首先创建了一个 Ra…

    C# 2023年5月31日
    00
  • C#自定义DataGridViewColumn显示TreeView

    下面是详细讲解“C#自定义DataGridViewColumn显示TreeView”的完整攻略: 1. 实现自定义DataGridViewColumn 首先,我们需要实现一个自定义的DataGridViewColumn类来支持TreeView的显示和编辑。 public class DataGridViewTreeViewColumn : DataGridV…

    C# 2023年5月15日
    00
  • 解析ASP.NET Core中Options模式的使用及其源码

    解析ASP.NET Core中Options模式的使用及其源码攻略 ASP.NET Core中Options模式是一种用于配置应用程序的机制。在本攻略中,我们将深入讨Options模式的使用及其源码,并提供两个示例说明。 Options模式的使用 在ASP.NET Core中,Options模式是一种用于配置应用程序的机制。Options模式允许您将配置数据…

    C# 2023年5月17日
    00
  • C#控制台基础 List泛型集合与对应的数组相互转换实现代码

    下面是C#控制台基础 List泛型集合与对应的数组相互转换实现代码的完整攻略。 一、List泛型集合与数组的区别 List泛型集合和数组都可以用来存储一组数据,但二者在使用上有些许不同。主要区别如下: 数组的长度是固定的,一旦定义了长度就无法再改变;而List泛型集合的长度是可变的,可以随时添加或删除元素。 数组的元素只能是一种数据类型,而List泛型集合可…

    C# 2023年6月1日
    00
  • C# Socket数据接收的三种实现方式

    C# Socket数据接收的三种实现方式 前言 在网络通信过程中,数据的传递是至关重要的一个环节,而数据的收发是Socket编程中最为重要的操作之一。本文将探讨Socket数据接收方面的内容,介绍C# Socket数据接收的三种实现方式。 Socket数据接收的三种实现方式 在C# Socket编程中,Socket数据接收主要有以下三种实现方式: 阻塞式接收…

    C# 2023年6月1日
    00
  • 关于c#二叉树的实现

    关于C#二叉树的实现 什么是二叉树 二叉树是一种数据结构,它由节点和边组成,每个节点最多有两个子节点。二叉树通常用于搜索和排序,它是一种非常有效的数据结构。 C#中二叉树的实现 在C#中,可以通过类的方式实现二叉树。每个节点是一个类,节点中包含了左子节点、右子节点以及该节点的值。可以通过递归的方式遍历整个二叉树。 下面是C#中二叉树的实现代码: class …

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部