C# Random类生成随机数及互不相同随机数实现详解

落日邮差
落日邮差
发布时间:2026-10-15| 6人浏览过
原创

在C#开发中,随机数的应用极为广泛。本文将深入解析System.Random类的初始化机制、核心方法以及如何在特定区间内高效生成若干个互不重复的随机数,涵盖算法逻辑与完整代码示例。

准备条件:了解System.Random类

.NET Framework提供了专门用于产生伪随机数的类System.Random。由于计算机生成的数字基于特定算法,被称为“伪随机数”,但在绝大多数应用场景中,其随机程度已完全满足需求。

在使用该类前需了解两种初始化(设置随机种子)的方式:

  • 默认初始化:Random ra=new Random();。系统自动选取当前时间戳作为随机种子。
  • 指定种子初始化:int iSeed=6; Random ra=new Random(iSeed);。通过传入整型参数控制随机序列,常用于需要复现结果的测试场景。

真实操作顺序:基础随机数获取

第一步:使用Next()方法获取基础随机数

调用无参的Next()方法可返回一个非负整数(范围0至2,147,483,647),这通常超出实际业务需求。

// 返回大于等于 0 且小于 2,147,483,647 的整数
int baseNum = ra.Next();

第二步:指定最大值获取单值随机数

使用Next(int maxValue)重载方法,获取小于指定最大值的正随机数(例如获取0-19之间的数)。

// 返回小于 20 的正整数
int maxOnly = ra.Next(20);

第三步:指定区间范围获取随机数

最常用的是双参数重载Next(int minValue, int maxValue),返回指定范围内的随机整数。

// 返回介于 1 到 999 之间(含1,不含999)的随机数
int rangeNum = ra.Next(1, 999);

此外,该类还提供其他实用方法:
- NextBytes():用随机数填充字节数组。
- NextDouble():返回0.0到1.0之间的浮点数。

真实操作顺序:生成区间内互不相同的随机数

当需要在如1到20的区间内随机生成6个互不相同的整数时,简单的循环调用会出现重复。下面介绍一种结合时间种子与递归去重的解决方案。

第一步:设计获取不重复随机数的主函数

定义一个接收数量、最小值和最大值的函数。为保证随机性极强,此处采用DateTime.Now.Ticks强制转换并取反作为种子源,避免在快速连续运行时因时间未变导致随机数相同。

public int[] getRandomNum(int num, int minValue, int maxValue)
{
    // 使用系统时间Ticks作为随机种子,保证每次运行种子不同
    Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
    int[] arrNum = new int[num];
    int tmp = 0;
    
    for (int i = 0; i < num; i++)
    {
        // 先生成一个候选随机数
        tmp = ra.Next(minValue, maxValue);
        // 放入数组前先检查是否重复
        arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra);
    }
    return arrNum;
}

第二步:实现检测重复的递归辅助函数

使用getNum函数判断新生成的数字是否与数组中已有数字冲突。若存在重复,则重新生成;若唯一,则直接返回。注意必须复用同一个Random实例ra,否则生成的序列可能包含大量重复数值。

public int getNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra)
{
    int n = 0;
    while (n < arrNum.Length - 1)
    {
        // 循环判断新数字是否已存在于数组中
        if (arrNum[n] == tmp)
        {
            // 发现重复,重新获取一个随机数
            tmp = ra.Next(minValue, maxValue);
            // 递归再次检查
            getNum(arrNum, tmp, minValue, maxValue, ra);
        }
        n++;
    }
    return tmp;
}

第三步:在主程序中调用并展示结果

在事件触发器(如按钮点击)中执行上述函数,并将结果输出。

private void button1_Click(object sender, System.EventArgs e)
{
    // 从1到20中生成6个互不相同的随机数
    int[] arr = getRandomNum(6, 1, 20);
    string temp = "";
    foreach (int val in arr)
    {
        temp += val.ToString() + " ";
    }
    label1.Text = temp;
}

完成判断与注意事项

通过上述步骤,当按钮被点击时,界面将显示一串由空格分隔的不重复整数。若需调整生成规则,仅需修改getRandomNum函数中的参数即可。

排错指南:如果发现生成的随机数仍有重复,通常是递归函数中n<=arrNum.Length-1的逻辑边界或随机实例ra未保持一致性导致的。确保在递归调用中传递的是同一个ra对象。

简要总结

掌握System.Random的初始化与重载方法,配合合适的时间种子与校验算法,是处理C#中各类随机数需求的基础。以上就是C# Random类生成随机数及互不相同随机数实现的详细内容,更多关于C#教程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。