Random产生随机数问题
2015-09-18 13:51
351 查看
昨天在开发时发现这个问题,在同一个for循环内,通过Random多次产生随机数得到的随机数竟是一样的!以前还真没发现这个问题。
以下是简化的代码,如果将random定义在for循环外面则不会有问题(猜测Random与时间有关且存在固定的算法获取随机数),但实际开发中一般会把产生随机数封装为一个方法,调用的时候情况就与下面的一样了。
解决方案都是从随机种子下手,一般见到有下面两种:
通过Stopwatch测试,这两种方法的速度几乎没有区别,与不使用随机种子的方式在时间消耗上也没有差别,可以放心的使用,第二种更简捷!
以下是简化的代码,如果将random定义在for循环外面则不会有问题(猜测Random与时间有关且存在固定的算法获取随机数),但实际开发中一般会把产生随机数封装为一个方法,调用的时候情况就与下面的一样了。
StringBuilder builder = new StringBuilder(); for (int i = 0; i < 200; i++) { Random random = new Random(); builder.Append(random.Next(1000, 9999)); builder.Append("<br/>"); } Response.Write(builder.ToString());
解决方案都是从随机种子下手,一般见到有下面两种:
StringBuilder builder = new StringBuilder(); for (int i = 0; i < 200; i++) { Random random = new Random(GetRandomSeed()); builder.Append(random.Next(1000, 9999)); builder.Append("<br/>"); } Response.Write(builder.ToString()); static int GetRandomSeed() { byte[] bytes = new byte[4]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); rng.GetBytes(bytes); return BitConverter.ToInt32(bytes, 0); }
StringBuilder builder = new StringBuilder(); for (int i = 0; i < 200; i++) { Random random = new Random(Guid.NewGuid().GetHashCode()); builder.Append(random.Next(1000, 9999)); builder.Append("<br/>"); } Response.Write(builder.ToString());
通过Stopwatch测试,这两种方法的速度几乎没有区别,与不使用随机种子的方式在时间消耗上也没有差别,可以放心的使用,第二种更简捷!
相关文章推荐
- org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML doc
- 迷宫最短路径问题
- Test:开通博客
- 结对博客(Java通信项目QQ)
- 阅读 LdrInitializeThunk
- js实现图片旋转
- 就写个外键
- 时间序列模型之灰度模型
- ubuntu12.04 set python-pandas
- iOS9适配必看指南
- 二 Schema简介
- BigDecimal.setScale 处理java小数点
- 初探oVirt-缓存ovirt相关的rpm包到本地yum源中
- handlePollCalls方法详解
- android项目源码大全
- 猫学习IOS(十五)UI以前的热的打砖块游戏
- 使用JavaWeb项目的路径参数问题总结
- C++多态
- POJ 3276 Face The Right Way
- oj平台上标准输入输出