2009-12-02 143 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對此,你可能想檢查。