c# 如何生成随机数
技术百科
星降
发布时间:2026-01-26
浏览: 次 最常用方式是复用同一Random实例,避免循环中重复创建;多线程应使用Random.Shared(.NET 6+)或ThreadLocal;安全场景必须用RandomNumberGenerator。
用 Random 类生成基本随机数
最常用也最直接的方式是实例化 Random 类,然后调用它的方法。注意:不要在循环里反复新建 Random 实例,否则可能因种子相同导致重复序列。
推荐做法是复用同一个实例,尤其在高频调用场景下:
var rand = new Random(); int num = rand.Next(); // 0 到 int.MaxValue 之间 int range = rand.Next(1, 101); // 1 到 100(不含 101) double d = rand.NextDouble(); // [0.0, 1.0)
Random 在多线程下不安全
Random 实例不是线程安全的。多个线程同时调用 Next() 可能抛出 InvalidOperationException 或返回异常值(如负数、超限值)。
解决方案有三种,按推荐顺序:
- 用
ThreadLocal每线程隔离实例 - 改用
Random.Shared(.NET 6+,静态、线程安全) - 加锁(性能差,仅临时应急)
.NET 6 起推荐写法:
int safeNum = Random.Shared.Next(1, 101);
需要密码学安全?别用 Random
Random 和 Random.Shared 都是伪随机,可预测,**绝不能用于生成 Token、加密密钥、验证码盐值等安全敏感场景**。
应改用 System.Security.Cryptography.RandomNumberGenerator:
var bytes = new byte[4]; RandomNumberGenerator.Fill(bytes); int cryptoRand = BitConverter.ToInt32(bytes) & 0x7FFFFFFF;
这个值不可预测,但开销比 Random 高一个数量级,只在真正需要时用。
常见陷阱和兼容性注意
容易被忽略的点:
-
Next(min, max)的max是**排他上限**,比如Next(0, 5)只返回 0–4 - .NET Framework 与 .NET Core/.NET 5+ 的
Random算法不同,同一种子产生的序列不一致 - 给

Random传固定种子(如new Random(42))适合测试,但线上必须省略参数或用系统时间 - Unity 中若在
Update()里每帧 new Random(),大概率得到一串相同数字
种子逻辑本身不难,但错一次就可能让“随机”变成“固定”,尤其在分布式或高并发服务里,得盯紧实例生命周期和调用上下文。
# 能让
# 都是
# 线上
# 多个
# 最常用
# 复用
# 就可
# 循环
# 并发
# c#
# .net
# 线程
# red
# 多线程
# 算法
# Token
# crypto
# 不含
# 分布式
# 随机数
# unity
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- PythonPandas数据分析教程_数据清洗与处
- Linux如何安装Golang环境_Linux下G
- Python 模块的 __name__ 属性如何由
- 小程序里php怎么变mp4_小程序调用php生成m
- Win11用户账户控制怎么关_Win11关闭UAC
- Windows 10怎么把任务栏放在屏幕上方_Wi
- 如何在 Python 测试中动态配置 @backo
- Win11怎么关闭自动更新 Win11永久关闭系统
- 如何提升Golang JSON序列化性能_Gola
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- 一文教你快速开通网站LOGO图
- c++23 std::expected怎么用 c+
- Python大型项目拆分策略_模块化解析【教程】
- c++中explicit(bool)的用法 c++
- php485返回空数组怎么回事_php485数据接
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- 如何在 Windows 11 中使用 AlomWa
- Python装饰器设计思路_功能增强机制说明【指导
- Windows10如何更改任务栏高度_Win10解
- Python日志系统设计与实现_高可观测性架构实战
- Win11笔记本怎么看电池健康度_Win11电池报
- Win10系统更新错误0x80240034怎么办
- Windows 11如何开启文件夹加密(EFS)_
- 如何自定义Windows终端的默认配置文件?(Po
- Python包结构设计_大型项目组织解析【指导】
- Windows如何查看和管理已安装的字体?(字体文
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- Python异步网络编程_aiohttp说明【指导
- Windows怎样关闭开始菜单推荐广告_Windo
- 如何在Windows中创建新的用户账户?(标准与管
- Win11怎么退出高对比度模式_Win11取消反色
- Python文本编码与解码_跨平台解析说明【指导】
- 如何在Golang中写入XML文件_生成符合规范的
- php下载安装后memory_limit怎么设置_
- 如何在Golang中捕获JSON序列化错误_Gol
- c++怎么实现高并发下的无锁队列_c++ std:
- Win11更新后变慢怎么办_Win11系统更新后卡
- PHP主流架构如何处理会话管理_Session与C
- Python lxml的etree和Element
- Python数据挖掘进阶教程_分类回归与聚类案例解
- Win11怎么用设置清理回收站_Win11设置清理
- Win11怎么设置ipv4地址_Windows 1
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- Win11怎么设置虚拟内存最佳大小_Windows
- 本地php环境出现502错误_nginx或apac
- Python随机数生成_random模块说明【指导
- 如何使用Golang优化模块引入路径_Golang
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Win11怎么更改输入法顺序_Win11调整语言首


QQ客服