Random的实现原理
在知乎上看到老赵回答了 你在编程时见过最愚蠢的 Bug 是什么?
首先是段JS代码:
不要运行,猜猜看这段代码会alert出什么结果来?
答案是:10。好吧,为什么不是20?
再来一段.NET的:
生成10个随机数,尽管每次运行结果都不同,但为什么每次这10个数字都是相同的?
var number = 10;
var showNumber = function () {
alert(number);
}
(function () {
number = 20;
showNumber();
})()
答案是:10。好吧,为什么不是20?
再来一段.NET的:
var numbers = new int[10];
// 生成10个随机数
for (var i = 0; i < numbers.Length; i++) {
numbers[i] = new System.Random().Next();
}
其中第一js是因为没在showNumber后面(第四行)加“;”;
第二.NET的随机数这个问题我倒是没遇到过,几乎每次只会用一个不会一次调用多个,所以没注意。
先看看msdn怎么说:
使用与时间相关的默认种子值,初始化 Random 类的新实例。
The default seed value is derived from the system clock and has finite resolution. As a result, different Random objects that are created in close succession by a call to the default constructor will have identical default seed values and, therefore, will produce identical sets of random numbers.This problem can be avoided by using a single Random object to generate all random numbers. You can also work around it by modifying the seed value returned by the system clock and then explicitly providing this new seed value to the Random(Int32) constructor. (英语不好,就贴原文了)
Random的种子利用的是系统时钟种子。而Windows系统时钟的更新频率大概在10ms左右(各个版本不一样),而这个for循环的执行显然要快得多,那每次利用的就是同一个种子,种子相同,Random产生相同的随机数(即使实例不同也一样)。所以返回的10个值都是一样的了。
解决方法:
第一种利用Thread.Sleep让线程休眠一段时间(时间大于Windows系统时钟的更新频率),这个不推荐使用。
第二种将初始化移出循环:
var numbers = new int[10];
// 初始化Random
System.Random rd = new System.Random();
for (var i = 0; i < numbers.Length; i++)
{
numbers[i] = rd.Next();
}
Enjoy Code,Enjoy Life.
作者:Frank.Lee
出处:http://www.cnblogs.com/lichunyang/
版权:本文版权归作者和博客园共有
转载:欢迎转载,必须保留原文链接
作者:Frank.Lee
出处:http://www.cnblogs.com/lichunyang/
版权:本文版权归作者和博客园共有
转载:欢迎转载,必须保留原文链接
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!