legongju.com
我们一直在努力
2025-01-13 17:44 | 星期一

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.legongju.com/article/106852.html

相关推荐

  • C# CopyFromScreen的注意事项

    C# CopyFromScreen的注意事项

    CopyFromScreen 是 C# 中 Graphics 类的一个方法,用于从屏幕上复制一个矩形区域到一个位图(Bitmap)对象 性能考虑:CopyFromScreen 方法可能会消耗大量的系统资...

  • C#中如何高效地进行屏幕拷贝

    C#中如何高效地进行屏幕拷贝

    在C#中,要高效地进行屏幕拷贝,可以使用Graphics类的CopyFromScreen方法
    using System;
    using System.Drawing;
    using System.Windows.Forms; na...

  • C#实现屏幕拷贝的代码示例

    C#实现屏幕拷贝的代码示例

    在C#中,可以使用Graphics类和Bitmap类来实现屏幕截图
    using System;
    using System.Drawing;
    using System.Windows.Forms; namespace ScreenCapt...

  • 利用C# CopyFromScreen截图的方法

    利用C# CopyFromScreen截图的方法

    在C#中,可以使用Graphics.CopyFromScreen方法来截取屏幕上的一部分区域
    using System;
    using System.Drawing;
    using System.Windows.Forms; nam...

  • C# point如何转换为其他类型

    C# point如何转换为其他类型

    在C#中,Point类型通常表示一个二维坐标系中的点。要将Point对象转换为其他类型,您需要根据目标类型进行相应的操作。以下是一些常见的转换示例: 转换为Size类型...

  • C# point在图形编程中的应用

    C# point在图形编程中的应用

    在C#图形编程中,Point结构体通常用于表示二维平面上的一个点。它包含两个整数属性:X和Y,分别表示点在水平轴和垂直轴上的位置。Point结构体常用于处理与坐标系...

  • C#中point类的使用方法

    C#中point类的使用方法

    在C#中,Point类通常用于表示二维平面上的一个点
    以下是Point类的一些基本用法: 创建一个Point对象: Point point1 = new Point(3, 4); 访问Point对象的X和...

  • C# point与坐标系的关系是什么

    C# point与坐标系的关系是什么

    在C#中,Point 结构表示二维平面上的一个点。它包含两个整数属性:X 和 Y,分别表示点在水平轴和垂直轴上的位置。这两个属性的值可以是正数、负数或零。
    坐...