我们平时生成随机数时用到的最多的还是Random,但是Random在并发情况下同一时刻(相差毫秒级)生成的随机数基本上都是重复的,为什么会这样呢,我们F12定位到Random的默认无参构造函数看下:
我们平时写随机,大部分应该是这样的写法:
new Random().Next(0, 100);
这样写默认的种子值就是当前时间,所以说在高并发下时间种子值是相同的,那么生成的随机数相同也就无可厚非了。那么如果在实际操作中,遇到了高并发的情况如何解决随机数重复的问题呢,Random实例化时可以传入一个数字int来作为种子,只要我们传入的这个数字在高并发下不重复就可以了。看代码:
static void Main(string[] args) { Console.WriteLine(new Random(Guid.NewGuid().GetHashCode()).Next(0, 300)); Console.WriteLine(new Random(Guid.NewGuid().GetHashCode()).Next(0, 300)); Console.WriteLine(new Random(Guid.NewGuid().GetHashCode()).Next(0, 300)); Console.WriteLine(new Random(Guid.NewGuid().GetHashCode()).Next(0, 300)); Console.WriteLine(new Random(Guid.NewGuid().GetHashCode()).Next(0, 300)) Console.ReadKey(); }
运行结果:
94
299
26
18
132
总结:guid每次生成的值都是不一样的,即使是在高并发的情况下,然后我们取到该guid值的哈希代码传入,这样就成功的解决了高并发下Random生成随机数重复的问题,当然这个同样适用于一个方法里生成多个随机数的场景,因为在一个方法或者接口里,程序的执行速度很快,基本上在运行时种子值都是一样的,这样也会导致生成的随机数一致。