首页 技术交流 C#高并发下Random生成随机数重复的解决方法 正文

C#高并发下Random生成随机数重复的解决方法

发布日期:2019年02月12日 16:27        阅读次数:2304

我们平时生成随机数时用到的最多的还是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生成随机数重复的问题,当然这个同样适用于一个方法里生成多个随机数的场景,因为在一个方法或者接口里,程序的执行速度很快,基本上在运行时种子值都是一样的,这样也会导致生成的随机数一致。

评论:

共 0 页 0 条记录,当前为第 1 页