C#随机生成配对

3
假设掷骰子的可能结果为{1,2,3,4,5,6}。
当掷两个骰子三次时,我想要收集两个骰子的随机结果。
我的实现方法是:
var q = from threeTimes in new int[] { 1, 2, 3 }
                    let set1 = new Random().Next(1, 6)
                    let set2 = new Random().Next(1, 6)
                    select new { s1 = set1, s2 = set2 };

            foreach (var v in q)
            {
                Console.WriteLine("Die1 :{0} Die2 :{1}", v.s1, v.s2);
            }

但大多数时候,我会收到相同的Die1和Die2值。

我的意思是

Die1: 5   Die2:  5

Die1: 2   Die2:  2

Die1: 2   Die2:  2

我需要做哪些更正以获得随机组合?


单数形式:骰子(die) 复数形式:骰子(dice) - Vedran
5个回答

11

这是因为你同时创建了两个Random对象。默认情况下,它们会使用基于时间的值进行种子初始化,最有可能是Environment.TickCount,尽管我没有看到过这一点得到确认。

在查询之前构造一个Random对象或分别给这两个对象设置种子值将解决此问题:

var rnd = new Random();
var q = from threeTimes in new int[] { 1, 2, 3 }
        let set1 = rnd.Next(1, 6)
        let set2 = rnd.Next(1, 6)
        select new { s1 = set1, s2 = set2 };

3

给你的Random一个种子(它的另一个构造函数),并保持使用同一个实例,而不是每次都新建一个。


2
创建一个Random()实例,然后调用其中的.Next()方法:
Random random = new Random();
var q = from threeTimes in new int[] { 1, 2, 3 }
                    let set1 = random.Next(1, 6)
                    let set2 = random.Next(1, 6)
                    select new { s1 = set1, s2 = set2 };

            foreach (var v in q)
            {
                Console.WriteLine("Dice1 :{0} Dice2 :{1}", v.s1, v.s2);
            }

0

在调用random.Next()的两次之间会发生什么?

我认为,在使用构造函数时,同一秒钟内的两次调用将检索到相同的值。尝试创建Random的实例并使用该实例。

Random r = new Random(); let set1 = r.next(1,6); let set2 = r.next(1,6);


0
Bart de Smet有一篇相当重要的文章,您可能想要查看。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接