2009-12-02 116 views
3

假设抛出模具的可能结果是{1,2,3,4,5,6}C#随机对生成

一个当两个骰子抛出三次,我想从两个骰子收集随机 结果。

我实现

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 

什么修正,我需要为了得到随机对做什么呢?

+0

单数:模子或骰子 复数:骰子 – Vedran 2009-12-02 08:35:33

+0

@Vedran - 的确如此。编辑。 – 2009-12-02 11:12:15

回答

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

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

2

创建一个随机()实例,然后调用。接下来():

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实例并使用该实例。

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

0

巴特德斯梅特有一个相当沉重的article对此,你可能想检查。