用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#创建WebService接口并连接的全过程

    下面是关于“C#创建WebService接口并连接的全过程”的完整攻略,包含两个示例。 1. 创建WebService接口 在C#中,可以使用Visual Studio创建WebService接口。以下是一个示例: 打开Visual Studio。 选择“文件”->“新建”->“项目”。 在“新建项目”对话框中,选择“ASP.NET Web应用程…

    C# 2023年5月15日
    00
  • C#迭代器方法介绍

    下面就是关于C#迭代器方法介绍的完整攻略。 什么是迭代器方法 迭代器是一种C#语言中的一种特殊方法,它允许我们以可枚举的方式迭代访问集合中的元素,而不必浪费时间和内存将整个集合复制到数组中。 如何编写迭代器方法 要编写一个迭代器方法,只需要使用yield关键字,将一个或多个元素作为集合的成员返回。这将构建时序集合,每个调用将返回它的下一个元素。在没有更多元素…

    C# 2023年5月15日
    00
  • C#:使用ffmpeg将图片合并成视频

      最近遇到公司的一个项目,需要将多张图片合并成一个播放的视频,找了很多资料和尝试了工具,遇到很多的坑,这里记下来,希望大家也能顺利解决遇到的问题。   合并视频,主要可以借用OpenCV 和 ffmpeg,这里是尝试用ffmpeg.exe的工具去实现图片文件合并成视频。   输入存储视频文件的路径,通过ProcessStartInfo 调用ffmpeg.e…

    C# 2023年4月30日
    00
  • C#向无窗口的进程发送消息

    下面是详细的讲解。 C#向无窗口的进程发送消息的完整攻略 在C#中,我们可以使用Windows API来向无窗口的进程发送消息。下面是完整的攻略。 1. 准备工作 要向无窗口的进程发送消息,我们需要知道目标进程的进程ID(PID)。可以使用Windows API中的Process.GetProcessesByName()方法获取指定名称的进程列表,然后根据需…

    C# 2023年6月6日
    00
  • ASP.NET:一段比较经典的多线程学习代码

    ASP.NET中的多线程编程可以极大地提高代码的执行效率,下面我将为大家讲解一段经典的多线程学习代码。这段代码涉及到了创建多个线程、线程之间的同步以及线程池等多个方面。 代码示例 下面是一个简单的多线程示例,该示例创建了两个线程,分别执行了两个不同的任务。 using System; using System.Threading; class Program…

    C# 2023年5月31日
    00
  • XAML如何获取元素的位置

    获取元素的位置是在开发XAML应用过程中很常见的需求,可以通过多种方式实现。下面是两种常见的方法: 1. 使用RenderTransformOrigin属性获取元素相对于父元素的位置 利用RenderTransformOrigin属性可以获取元素相对于父元素的位置。RenderTransformOrigin指定元素变形发生的中心点,而元素的位置在这个中心点附…

    C# 2023年6月6日
    00
  • C#全角半角转换函数代码分享

    C#全角半角转换函数代码分享 在C#开发中,我们经常会遇到需要将字符串中的全角字符转换为半角字符,或者将半角字符转换为全角字符的需求。为了方便开发,我们可以编写一个函数来完成这个任务。 函数说明 以下是一个C#中的全角半角字符转换函数代码: public static string Convert(string text, bool toDBC) { cha…

    C# 2023年6月7日
    00
  • C#使用虚拟方法实现多态

    下面是详细讲解“C#使用虚拟方法实现多态”的攻略。 什么是多态 多态是面向对象编程中一个重要的概念,指的是同一个方法调用在不同的情况下会产生不同的结果。 C#中多态的实现 C#中实现多态的方式主要有两种,一种是使用虚拟方法,另一种是使用接口。 使用虚拟方法实现多态 使用虚拟方法实现多态的过程主要有以下几步: 定义一个父类,其中包含一个虚拟方法。虚拟方法是指可…

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