经过写程序测试,结果总结如下:
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);
这样的好处就是,随机数的代码可以放到任何函数里面,就算一个执行顺序里面,很快地多次被调用,也不会一下产生都是相同的随机数了。