117.info
人生若只如初见

C#中随机数生成技巧有哪些

在C#中,生成随机数的常用方法是使用System.Random

  1. 使用单个随机数生成器:为了避免在短时间内创建多个随机数生成器实例(可能导致重复的随机数),可以使用一个静态的随机数生成器。
public static class RandomHelper
{
    private static readonly Random _random = new Random();

    public static int GetRandomNumber(int min, int max)
    {
        return _random.Next(min, max);
    }
}
  1. 使用System.Security.Cryptography.RNGCryptoServiceProvider生成密码学安全的随机数:当需要生成加密安全的随机数时,可以使用RNGCryptoServiceProvider类。
using System.Security.Cryptography;

public static class CryptoRandomHelper
{
    public static int GetCryptoRandomNumber(int min, int max)
    {
        using var rng = new RNGCryptoServiceProvider();
        var randomNumber = new byte[4];
        rng.GetBytes(randomNumber);
        int fullRange = max - min;
        int result = BitConverter.ToInt32(randomNumber, 0) % fullRange + min;
        return result;
    }
}
  1. 生成正态分布的随机数:可以使用Random.NextGaussian扩展方法生成正态分布的随机数。
public static class GaussianRandomHelper
{
    public static double NextGaussian(this Random random, double mean, double stdDev)
    {
        double u1 = random.NextDouble();
        double u2 = random.NextDouble();
        double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2);
        return mean + stdDev * randStdNormal;
    }
}
  1. 生成不重复的随机数序列:如果需要生成一个不包含重复元素的随机数序列,可以使用Fisher-Yates算法对一个有序的整数序列进行随机排序。
public static class UniqueRandomNumbersHelper
{
    public static IEnumerable GetUniqueRandomNumbers(int count, int min, int max)
    {
        if (count > max - min + 1)
            throw new ArgumentOutOfRangeException(nameof(count), "Count is too large.");

        var numbers = Enumerable.Range(min, max - min + 1).ToList();
        var random = new Random();

        for (int i = numbers.Count - 1; i >= 0; i--)
        {
            int j = random.Next(i + 1);
            yield return numbers[j];
            numbers[j] = numbers[i];
        }
    }
}

这些技巧可以帮助你在C#中更高效地生成随机数。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe909AzsBAgJQBQ.html

推荐文章

  • C++ REST框架的性能测试与基准比较

    C++ REST框架(Casablanca)是一个用于构建RESTful服务的跨平台C++库
    要进行性能测试和基准比较,你需要遵循以下步骤: 选择或设计一个性能测试场景:确定你...

  • C++ REST API的错误处理与日志记录

    在C++中实现REST API时,错误处理和日志记录是非常重要的。这有助于确保API的稳定性和可靠性,同时也有助于开发人员在出现问题时进行调试和排查。以下是一些建议...

  • C++ REST服务的负载均衡与高可用

    在C++中实现REST服务的负载均衡和高可用,通常需要以下几个关键组件: 负载均衡器(Load Balancer):负载均衡器负责将客户端请求分发到多个后端服务器。这样可以...

  • C++ REST API的数据验证与序列化

    在C++中,我们可以使用第三方库来实现REST API的数据验证和序列化 数据验证: 数据验证是确保接收到的数据满足预期格式和规则的过程。为了实现数据验证,我们可以...

  • 随机数c#如何生成高效

    在C#中,生成随机数的高效方法是使用System.Random类或者System.Security.Cryptography.RNGCryptoServiceProvider类 使用System.Random类: using System; class...

  • C#双向链表的未来发展方向

    C# 双向链表作为一种基本的数据结构,在很多场景下都有广泛的应用 性能优化:随着计算机硬件的发展,人们对于数据结构的性能要求越来越高。双向链表在插入和删除...

  • C#双向链表的并发控制探讨

    在多线程环境下,对双向链表进行并发控制是非常重要的,以确保数据的一致性和避免竞争条件。C# 提供了一些同步原语,如 Monitor、Mutex 和 Semaphore,可以用来实...

  • C#双向链表在算法中的应用实例

    在算法中,双向链表可以用于解决许多问题,特别是那些需要在列表中插入和删除元素时保持元素顺序的问题 LRU缓存:最近最少使用(Least Recently Used,LRU)缓存...