C# 生成随机数重复问题

今天做测试,在一个循环里面给实体属性赋随机值,然后生成一个实体集合,突然发现生成的实体集合中的所有实体相应属性值都是一样的,调试时却又发现值并不是重复的,度娘以后发现了问题——Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,系统默认是用UnCheck((Int)DateTime.Now.Ticks)做为参数种子,因此如果计算机运行速度很快(像小循环,执行速度太快了),如果触发Randm函数间隔时间很短,就有可能造成产生一样的随机数,因为伪随机的数字,在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。

解决办法有一般有2种:

1、延时的办法。

采用Thread.Sleep(100);//括号中给毫秒数

2、提高随机数不重复概率的种子生成方法,在New Random(SeedParam)时候保证SeedParam是唯一的

DEMO:

1.未作处理的随机(出现了重复的现象)

            for (int i = 0; i < 5; i++)
            {
                Random r = new Random();
                int num = r.Next(10000, 99999);//随机生成一个5位整数

                string tempStr = string.Empty;
                for (int j = 0; j < 4; j++)
                {
                    r = new Random();
                    int x = r.Next(65, 90);//65-90代表A-Z的ASCII值
                    char a = (char)x;
                    tempStr += a.ToString();
                }

                Console.WriteLine("num" + i.ToString() + "的值是:" + num);
                Console.WriteLine("tempStr" + i.ToString() + "的值是:" + tempStr);
            }            

执行结果如下:

2.利用提高随机种子进行随机生成(未出现重复现象)

            for (int i = 0; i < 5; i++)
            {
                Random r = new Random(int.Parse(DateTime.Now.ToString("HHmmssfff")) + i);
                int num = r.Next(10000, 99999);//随机生成一个5位整数

                string tempStr = string.Empty;
                for (int j = 0; j < 4; j++)
                {
                    r = new Random(int.Parse(DateTime.Now.ToString("HHmmssfff")) + i + j);
                    int x = r.Next(65, 90);//65-90代表A-Z的ASCII值
                    char a = (char)x;
                    tempStr += a.ToString();
                }

                Console.WriteLine("num" + i.ToString() + "的值是:" + num);
                Console.WriteLine("tempStr" + i.ToString() + "的值是:" + tempStr);
            }

执行结果如下:

时间: 2024-08-28 11:09:12

C# 生成随机数重复问题的相关文章

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

C# Random循环生成随机数重复问题解决方案

C# Random循环生成随机数重复问题解决方案1.当我们通过Random生成随机数时,习惯的写法如下: int a=new Random().Next(0,100); 然后生成一个数据数没有任何问题,但是代码修改如下 for(int i=0;i<1000;i++){ Console.WriteLine(new Random().Next(0,100)); } 问题:你会发现生成的随机数居然完全一样.肿么办呢? 2.解决:之所以会出现这样的情况是因为C#生成随机数和计算的时间有关系,如果生成太快

C#生成不重复随机数的方法

在使用Random类生成随机数时,我们可能会碰到生成随机数重复的问题. 比如我们要生成6位数字验证码,虽然也是使用Random,但是可能出现111111,999999这样的情况. 这是因为在实例化Random类时,如果随机种子不填写,默认是以时间线作为种子进行伪随机运算,当计算运行速度过快时,导致所有的随机种子都是一个值. 解决的方法也很简单,我们使用Guid的哈希码作为种子值,就不会重复了,代码如下: 1 public class RandomHelper 2 { 3 /// <summary

生成不重复随机数函数

// 生成随机数函数 function createRandom(num,from,to) { var arr=[]; // 随机数数组 var json={}; // 标记json对象 while(arr.length<num) { // 产生单个随机数 var ranNum=Math.round(Math.random()*(to-from))+from; // 通过判断json对象的索引值是否存在 来标记 是否重复 if(!json[ranNum]) { json[ranNum]=1; a

Java编程:实现双色球彩票生成器,生成不重复随机数

public static void main(String[] args) {  System.out.print("红色的号码为:");  Set<Integer> set=new HashSet<Integer>();  while (true) {   int i=(int)(Math.random()*33+1);   set.add(i);   if (set.size()>=6) {    break;   }  }  for (Object

C# Random 生成不重复随机数

Random 类 命名空间:System 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. 伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了. 伪随机数的生成是从种子值开始.如果反复使用同一个种子,就会生成相同的数字系列.产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列.默认情况下,Random 类的无参数构造函数

用C#生成不重复的随机数

对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数.伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了.伪随机数的选 择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地"随机",随机种子的选择就显得非常重要.如果随机种子一样,那么同一个随机数发生器产生 的随机数也会一样.一

[转载][记录]javascript生成不重复的随机数

参考链接:javascript生成不重复的随机数 项目播放视频,是无序的,有上下两个按钮,所以需要生成1,8不重复的随机数数组,如: 7,4,8,6,1,5,3,2 然后再split一次,就是数组了. 拿来主义了

mysql生成不重复随机数(unique number generation)

转自:http://blog.csdn.net/dreamer2020/article/details/52049629 问题来源 业务中有时会遇到要生成不重复随机数的情况,例如,新生成一个商品编号.房间编号.或者其他物品编号等.不愿意采用表的自增索引 id,同时又希望新生成的编号是不重复的. 这就需要考验mysql的随机数功能了. Solution mysql的rand函数可以生成一个0到1之间的随机数,进行一定的放大即可得到一个随机数.再通过条件查询来限制新随机数没有在表中出现过.如下所示: