Random产生随机数问题

  昨天在开发时发现这个问题,在同一个for循环内,通过Random多次产生随机数得到的随机数竟是一样的!以前还真没发现这个问题。

  以下是简化的代码,如果将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测试,这两种方法的速度几乎没有区别,与不使用随机种子的方式在时间消耗上也没有差别,可以放心的使用,第二种更简捷!

时间: 2024-11-08 20:58:44

Random产生随机数问题的相关文章

随机函数Math.random()_随机数,随机排序

Math.random() 返回0到1之间的随机数(小数) 如:0.6417997585228452 通过Math.random()和sort函数可实现数组的随机排序,代码如下: 1 arr.sort(function( a, b ){ 2 return Math.random() - 0.5; 3 }); 4 5 alert( arr ); //8,7,4,3,2,1,5,6 总结产生随机数的公式: x ~ y 产生x到y之间的随机整数Math.round( Math.random()*(y-

Random生成随机数重复的问题

一.Random生成随机数重复的问题 Random在生成随机数的时候,如果生成的时间非常短,那么很可能会出现生成的随机数重复的问题. 示例: static void Main(string[] args) { for (int i = 0; i < 10; i++) { Random random = new Random(); Console.WriteLine(random.Next(1, 100)); } Console.ReadKey(); } 输出如下: 解决方案:只使用一个Rando

Random:产生随机数的类

1 /* 2 * Random:产生随机数的类 3 * 4 * 构造方法: 5 * public Random():没有给种子,用的是默认种子,是当前时间的毫秒值 6 * public Random(long seed):给出指定的种子 7 * 8 * 给定种子后,每次得到的随机数是相同的. 9 * 10 * 成员方法: 11 * public int nextInt():返回的是int范围内的随机数 12 * public int nextInt(int n):返回的是[0,n)范围的内随机数

【Java】switch+for循环语句+while循环+do...while循环+Random产生随机数

1. switch语句 1.1 switch语句结构(掌握) 格式 switch (表达式) {  case 1:  语句体1;  break;  case 2:  语句体2;  break;  ...  default:  语句体n+1;  break; } 执行流程: 首先计算出表达式的值 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束. 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉.

.Net Random产生随机数

之前用winform做过有个摇奖游戏,其中中奖条件为产生的两个随机数一致则中奖,测试发现每次都会中奖. 忘记方式是怎么解决的了,今天看到了传智论坛的一片文章也是关于Random的,就点进去看了,它里面说产 生随机数的种子是程序运行的毫秒数(在不指定的情况下),于是进行了测试,发现果然是这样的,只要种子一样, 产生的随机数就是一样的,下面是图片: 因为程序运行的很快,所以两个随机实例的种子seed会是一样的.

猜数字小游戏(创建一个控制台。。。原理:random 产生随机数)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace eluosi{    class Program    {        static void Main(string[] args)        {            new Program().play();        }        v

Python:random获取随机数用法小记

在Python中,获取随机数的方法大致有如下这些: # -*- coding:utf-8 -*- # 指定编码,否则以下中文注释运行通不过 import random # 导入random # python中利用random获取一个0到1的随机浮点数 a = random.random() print a # <span style="font-family: Arial, Helvetica, sans-serif;">python中利用random获取一定范围内的(10

【转载】python 模块 - random生成随机数模块

http://blog.csdn.net/pipisorry/article/details/39086463 随机数种子 要每次产生随机数相同就要设置种子,相同种子数的Random对象,相同次数生成的随机数字是完全相同的: random.seed(1) 这样random.randint(0,6, (4,5))每次都产生一样的4*5的随机矩阵 关于种子的介绍可参见[Java - 常用函数Random函数] Python标准库random模块 (生成随机数模块) random.random() r

java java.uitl.Random产生随机数

通过使用java.uitl.Random产生一个1-10内的随机数.例: 1 Random random = new Random(); 2 int i = Math.abs(random.nextInt() % 10) + 1; 3 System.out.println("随机数: " + i); Random使用了System.currentTimeMillis(),作为默认的种子,当然你也可以在构造Random时自己制定一个种子,只是这时在当次运行中的结果(对于同一种子的Rand