C#随机对生成

时间:2009-12-02 08:15:42

标签: c# linq

假设掷骰子的可能结果是{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

为了获得随机对,我需要进行哪些更正?

5 个答案:

答案 0 :(得分: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 };

答案 1 :(得分:3)

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

答案 2 :(得分: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);
            }

答案 3 :(得分:0)

运行random.Next();介于两者之间?

我认为在使用构造函数时,同一秒内的两个调用将检索相同的值,这样您就可以使用它。 尝试创建一个Random实例,然后使用它。

随机r = new Random(); 设set1 = r.next(1,6); 设set2 = r.next(1,6);

答案 4 :(得分:0)

巴特德斯梅特有一个非常沉重的职责article,你可能想检查一下。