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; ?>
】
相关推荐
- Golang如何遍历目录文件_Golang fil
- 如何使用Golang理解结构体指针方法接收者_Go
- 如何使用Golang实现文件加密_Golang c
- c++如何连接Redis c++ hiredis库
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- php嵌入式多设备通信怎么实现_php同时管理多个
- Win11怎么设置右键刷新选项_Windows11
- Win11如何卸载OneDrive_Win11卸载
- 如何使用Golang进行HTTP服务性能测试_测量
- Go 中 defer 在 goroutine 内部
- Windows电脑如何进入安全模式?(多种按键方法
- 如何在Golang中实现微服务服务拆分_Golan
- Win11开始菜单打不开_修复Windows 11
- PHP主流架构如何处理会话管理_Session与C
- Win11怎么查看显卡温度 Win11任务管理器查
- Win11右键反应慢怎么办 Win11优化右键菜单
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- Win11文件夹预览图不显示怎么办_Win11缩略
- Win11如何添加/删除输入法 Win11切换中英
- Windows 10自带杀毒软件在哪_Window
- 如何使用Golang实现跨域请求支持_Golang
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- 如何在 Django 中修改用户密码后保持会话不丢
- 为什么Go需要go mod文件_Go go mod
- Windows10电脑怎么设置虚拟内存_Win10
- Mac电脑进水了怎么办_MacBook进水后紧急处
- php文件怎么变mp4保存_php输出视频流保存为
- php串口通信波特率怎么选_根据硬件手册设置正确波
- Win11怎么关闭任务栏小组件_Windows11
- Python数据抓取合法性_合规说明【指导】
- PHP 中如何在函数内持久修改引用变量所指向的目标
- Win11系统占用空间大怎么办 Win11深度瘦身
- 如何在Golang中捕获HTTP服务器错误_Gol
- 如何自定义Windows终端的默认配置文件?(Po
- 如何在 Go 中高效缓存与分发网络视频流
- Win11怎么开启HDR模式_Windows 11
- Win11怎么设置虚拟内存_Windows 11优
- Win11怎么关闭小组件_Win11禁用任务栏天气
- C++如何获取CPU核心数?(std::threa
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- Win11怎么设置麦克风权限_允许应用访问Win1
- Win11视频默认播放器怎么改_Win11关联第三
- 如何在Golang中解压文件_Golang com
- Win11如何设置开机问候语 Win11修改登录界
- Win11无法拖拽文件到任务栏怎么办_Win11开
- Win11怎么更改鼠标指针方案_Windows11
- 如何使用Golang encoding/json解
- c# await 一个已经完成的Task会发生什么
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设


QQ客服