新闻中心

C# 如何生成随机数 - Random类的正确使用姿势

2025-12-07
浏览次数:
返回列表
正确使用Random需注意实例化方式:应声明为静态只读字段复用,避免频繁新建导致重复;多线程下用ThreadLocal隔离实例防冲突;加密场景改用RandomNumberGenerator确保安全;高频操作可封装提升复用性。

c# 如何生成随机数 - random类的正确使用姿势

生成随机数看似简单,但用错 Random 类很容易导致重复、不随机,甚至多线程下崩溃。核心问题不在“怎么写”,而在“怎么实例化”和“怎么复用”。

别在方法里 new Random()

每次调用都新建一个 Random 实例,尤其在循环或高频方法中,会因系统时间种子相同而产生一连串重复值。

错误写法:

int GetRandomNumber() {
    var r = new Random(); // ❌ 每次都新造一个,种子可能一样
    return r.Next(1, 100);
}

正确做法:把 Random 声明为 静态只读字段,全局复用一个实例:

private static readonly Random _random = new Random();

int GetRandomNumber() {
    return _random.Next(1, 100); // ✅ 安全、高效、真随机
}

多线程环境下要用 ThreadLocal<random></random>

Random 不是线程安全的——多个线程同时调用 Next() 可能导致内部状态损坏,返回 0 或异常。

推荐方案:用 ThreadLocal<random></random> 为每个线程独享一个实例:

private static readonly ThreadLocal<Random> _threadLocalRandom 
    = new ThreadLocal<Random>(() => new Random());

int GetRandomInParallel() {
    return _threadLocalRandom.Value.Next(1, 100);
}

这样既避免锁开销,又杜绝线程冲突。

Openflow Openflow

一键极速绘图,赋能行业工作流

Openflow 88 查看详情 Openflow

需要加密级随机?换用 RandomNumberGenerator

Random 是伪随机,适合游戏、抽样等场景;但密码、Token、密钥等绝不允许预测,必须用加密安全的随机源。

示例(.NET 6+):

byte[] bytes = new byte[4];
RandomNumberGenerator.Fill(bytes);
int cryptoRandom = BitConverter.ToInt32(bytes) & 0x7FFFFFFF; // 转正整数

旧版本可用 RNGCryptoServiceProvider(已过时但仍可用),不过推荐统一升级到 RandomNumberGenerator

小技巧:封装常用随机逻辑

避免到处写 Next(),把高频操作封装起来,提升可读性和复用性:

  • 随机布尔_random.NextDouble()
  • 随机字符串(字母+数字)Enumerable.Repeat("ABCDEFGHJKLMNPQRSTUVWXYZ23456789", 8).Select(s => s[_random.Next(s.Length)]).ToArray()
  • 随机打乱数组:用 Fisher-Yates 算法,每次交换都依赖 _random.Next(i, array.Length)

基本上就这些。Random 类本身很简单,真正容易出错的是生命周期管理和使用边界。记牢:静态复用、线程隔离、安全场景换 RNG——随机,就该随机得靠谱。

以上就是C# 如何生成随机数 - Random类的正确使用姿势的详细内容,更多请关注其它相关文章!


# 如何在  # 女装面料关键词优化排名  # 汽车推广运营招聘网站  # 南漳县网站线上推广渠道  # 专业团队网站建设开发  # 怎么样去推广餐饮店营销  # 鄂州网站建设方案策划  # 邵阳网站推广哪里好  # 海口seo优化官网  # 荆州seo推广公司  # 阜平县网站推广哪家便宜  # 工作流  # c#  # 多个  # 密级  # 的是  # 新造  # 长时间  # 多线程  # 复用  # cryptos  # crypto  # .net  # 随机数 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  解决移动端滚动问题的overflow属性应用指南  实现全屏滚动与导航点:专业教程  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  C++指针和引用有什么区别_C++内存管理核心概念深度解析  excel如何生成目录 excel一键生成工作表目录超链接  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  漫蛙网页登录入口 漫蛙漫画官方授权网址  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  yy漫画网页版官方入口_yy漫画官网登录页面链接  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  Golang指针如何与map组合使用_Golang map指针组合实践  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  J*aScript DOM操作:高效清空列表元素的策略与实践  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  优化Log4j2控制台输出性能:解决异步日志瓶颈  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  Go语言JSON解析深度指南:动态访问与结构体映射实践  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  AO3最新入口2025公告_AO3中文官网合集  必由学官网入口 必由学教师登录入口  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  Golang如何使用const iota_Go iota常量计数器讲解  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  千牛数据看板网页版_千牛数据看板网页版访问方法  mcjs网页版在线存档 mcjs云存档登录入口  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  微信网页版扫码登录入口 微信网页版二维码登录入口  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  Lar*el 8 多关键词数据库搜索优化实践  《刺客信条:影》PS5 Pro和Switch 2画面对比  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  J*a TimerTask中HashMap意外清空的深层原因与解决方案  Go语言中的*string:深入理解字符串指针  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  如何将HTML表格多行数据保存到Google Sheet  Pandas DataFrame:高效添加条件计算列  Golang如何使用new_Go new分配内存机制讲解  AO3同人作品网入口 AO3搜索引擎官网永久地址  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除 

搜索