c# 如何一次产生多个不同的随机数?

经过写程序测试,结果总结如下:


1、如果想一次性产生4个随机数,那么使用一个Random对象,调用4次Next函数,如此所示:

Random r = new Random();
int rInt = r.Next(100);
int rInt11 = r.Next(100);
int rInt12 = r.Next(100);
int rInt13 = r.Next(100);

经过反复测试,产生的四个随机数没有发现重复的。

 

2、如果是4个对象,分别调用,如下所示:

Random r = new Random();
int rInt = r.Next(100);

Random r2 = new Random();
int rInt2 = r2.Next(100);

Random r3 = new Random();
int rInt3 = r3.Next(100);

Random r4 = new Random();
int rInt4 = r4.Next(100);

产生的4个随机数每次都是一样的,原因是,Random类是一个产生伪随机数的类,构造函数Random()是根据触发那刻的系统时间做为种子,因为计算机运行速度很快,触发Randm函数间隔时间很短,就会造成产生一样的随机数。而上面用同一个对象的话,感觉c#做了去重优化处理。

 

3、Random类还有一个构造函数Random(int Seed),可以自己设定触发的种子。但是,必须设置不同的种子,才能产生不同的随机数。弊端就是每次得设置不同的种子,不然的话,每次产生的随机数都是一样的。

 

4、如果不是同时就要四个随机数,可以使用延迟的办法产生,因为时间有延迟,随机的种子就会不同,就会产生不同的随机数。

 

5、当然,产生随机数的办法有很多种,如果有更好方法,不吝赐教!
 

2021.03.17 补充:

又看到一个东东:RNGCryptoServiceProvider类,可以生成更加可靠的随机数,因为它采用系统当前的硬件信息、进程信息、线程信息、系统启动时间和当前精确时间作为填充因子,通过更好的算法生成高质量的随机数。

比如,我们想生成0~100的随机数,如下所示:

byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
int n = BitConverter.ToInt32(bytes, 0);

decimal maxValue = (decimal)int.MaxValue;
int nn = (int)(Math.Abs(BitConverter.ToInt32(bytes, 0)) / maxValue * 100);

这样的好处就是,随机数的代码可以放到任何函数里面,就算一个执行顺序里面,很快地多次被调用,也不会一下产生都是相同的随机数了。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值