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#生成随机数和计算的时间有关系,如果生成太快就会造成这个问题
解决方案1:
暂停一定时间

for(int i=0;i<1000;i++){
    Console.WriteLine(new Random().Next(0,100));
    Thread.Sleep(100);
}

解决方案2:

for(int i=0;i<1000;i++){
    Console.WriteLine(new Random(Guid.NewGuid().GetHashCode()).Next(0,100));
    Thread.Sleep(100);
}

结语:个人更偏向于第二种解决方案,因为第一种明显降低了执行效率

时间: 2024-07-31 17:08:20

C# Random循环生成随机数重复问题解决方案的相关文章

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

.Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

.Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: for (int i = 0; i < 10; i++) { Random random1 = new Random(); Console.WriteLine(random1.Next()); } 测试生成随时基本都是相同的结果: 很显然上面的结果是不靠谱的,为什么会这样呢,因为微软的Random类,发现在C#中生成随机数使用的算法是线性同余法

Random 类生成随机数

Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Random对象,相同次数生成的随机数字是完全相同的.也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同.这点在生成多个随机数字时需要特别注意. 下面介绍一下Random类的使用,以及如何生成指定区间的随机数组以及实现程

C# 生成随机数重复问题

今天做测试,在一个循环里面给实体属性赋随机值,然后生成一个实体集合,突然发现生成的实体集合中的所有实体相应属性值都是一样的,调试时却又发现值并不是重复的,度娘以后发现了问题——Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,系统默认是用UnCheck((Int)DateTime.Now.Ticks)做为参数种子,因此如

random 方法 生成随机数

Math.random() 生成 大于等于0.0 且小于 1.0 的double 型随机数 ( 0.0 <= Math.random() < 1.0 ) 可以使用它便携简单了表达式,生成任意范围的随机数. 例如: (int)(Math.random() * 10)   返回 0   ~   9   之间的一个随机整数 50 + (int)(Math.random() * 50) 返回 50 ~ 99   之间的一个随机整数 通常 a + Math.random() * b   返回 a   ~

java Random类生成随机数

封装一个方法: import java.util.Random; public class RandomUtil { /** * nextInt(num) 产生[0 ~ (num-1)]的随机数, 闭区间 * @param Min * @param Max * @return */ public static int getRandomInt(int Min , int Max){ Random rand = new Random(); return rand.nextInt(Max - Min

导入random模块, 生成0-100间所有数字的随机列表(列表中的数字不重复)

导入random模块, 生成0-100间所有数字的随机列表(列表中的数字不重复)思路:先导入随机数生成模块,通过循环生成随机数,判断生成随机数是否有相同的,把不同的写入列表 方法一:方法二: 欢迎各路大神指正 原文地址:http://blog.51cto.com/10412806/2088010

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

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

Java中生成随机数Random、ThreadLocalRandom、SecureRandom、Ma

我们来说说Java常见的生成随机数的几种方式:Random,ThreadLocalRandom,SecureRandom;其实产生随机数有很多种方式但我们常见的就这几种,如果需要详细了解这个三个类,可以查看JAVA API. Random random = new Random(); int a = random.nextInt(5);//随机生成0~4中间的数字 其实Random是有构造函数的,他的参数可以传一个long类型的值,当使用空的构造的时候,使用的实际上是System.nanoTim