簡體   English   中英

C#隨機對生成

[英]C# Random Pair generation

假設擲骰子的可能結果是{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

為獲得隨機對,我需要進行哪些修正?

發生這種情況是因為您正在即時創建兩個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 };

給Random一個種子(它的其他構造函數)並繼續使用相同的實例,而不是每次都新建一個。

創建一個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);
            }

運行random.Next(); 在兩者之間?

我認為在使用構造函數時,同一秒內的兩個調用將檢索相同的值,這樣您就可以使用它。 嘗試創建一個Random實例並使用該實例。

隨機r = new Random(); 設set1 = r.next(1,6); 設set2 = r.next(1,6);

巴特德斯梅特有一篇相當重要的文章 ,你可能想檢查一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM