用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#中的位运算符包括位与(&)、位或(|)、取反(~)、异或(^)、左移(<<)和右移(>>), 下面逐一介绍它们的用法。 位与(&) 位与运算符用于将两个二进制数的相应位设置为1,然后返回一个新的值。只有当两个数的相应位都是1时…

    C# 2023年6月7日
    00
  • Powershell小技巧之非相同域或信任域也能远程

    Powershell小技巧之非相同域或信任域也能远程 在使用Powershell远程管理计算机时,如果计算机不在相同的域或信任域中,可能会遇到一些问题。本文将介绍如何使用Powershell远程管理非相同域或信任域中的计算机。 步骤1:使用Powershell的New-PSSession命令 首先,我们需要使用Powershell的New-PSSession…

    C# 2023年5月15日
    00
  • C# 将数据库SqlServer数据绑定到类中的过程详解

    标题 C# 将数据库 SqlServer 数据绑定到类中的过程详解 简介 本篇攻略主要介绍 C# 中如何将数据库 SqlServer 数据绑定到类中,从而方便数据操作和管理。 过程分析 3.1 使用 DataSet 进行绑定 在 C# 中,使用 DataSet 对象可以将数据库中的数据绑定到类中。具体操作步骤如下: (1)建立 C# 项目,并在项目中添加 S…

    C# 2023年6月2日
    00
  • c# 如何用lock解决缓存击穿

    当系统中缓存访问热点集中,且其中某些key的缓存失效时间过短,导致大量的请求直接访问DB,从而在DB上产生很大的压力,遇到高并发情况下往往会导致系统崩溃。这种情况就被称为“缓存击穿”。 C#语言提供了一种避免缓存击穿的方法,就是使用lock关键字,将可能产生高并发的代码块锁住,这样系统中只有一个线程能够访问这段代码,从而避免了缓存击穿的情况。 下面是使用lo…

    C# 2023年6月1日
    00
  • C#实现归并排序

    下面是“C#实现归并排序”的完整攻略。 什么是归并排序 归并排序是一种基于“分治”思想的排序算法。该算法将待排数组递归地分成两部分,分别进行排序,最后合并成有序序列。 归并排序的步骤 拆分:将待排数组递归地拆分成左右两个子数组,直到每个子数组只有一个元素。 排序:将左右子数组分别进行排序,排序完成后合并。 合并:合并左右两个有序子数组为一个有序数组。 C#实…

    C# 2023年6月7日
    00
  • 一个ASP.NET中使用的MessageBox类

    MessageBox类是ASP.NET中常用的一种弹出对话框的类,可以用于在页面中弹出各种对用户的提示和警告,使用起来非常方便。 创建MessageBox实例 首先,需要在页面中引入System.Windows.Forms名称空间,以便使用MessageBox类。 using System.Windows.Forms; 然后,我们可以使用以下方式来创建Mes…

    C# 2023年6月3日
    00
  • C# DataTable.Select()根据条件筛选数据问题

    C# DataTable类是一个非常强大的数据容器,通过Select方法可以选择满足筛选条件的数据行,并且将这些数据行返回到一个新的DataTable对象中。下面是使用DataTable.Select()方法根据条件筛选数据的完整攻略: 1. 准备数据表 首先,我们需要准备一个数据表,作为我们示例代码中的数据来源。可以使用如下代码创建一个名为”Student…

    C# 2023年6月6日
    00
  • ASP.NET Core – 缓存之内存缓存(下)

    话接上篇 [ASP.NET Core – 缓存之内存缓存(上)],所以这里的目录从 2.4 开始。 2.4 MemoryCacheEntryOptions MemoryCacheEntryOptions 是内存缓存配置类,可以通过它配置缓存相关的策略。除了上面讲到的过期时间,我们还能够设置下面这些: 设置缓存优先级。 设置在从缓存中逐出条目后调用的 Post…

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