2013-03-20 118 views
0

對於某些TreeView,我想測試項目背景屬性的很多值。如何獲得好的隨機結果

所以我有一棵樹,現在裝滿了200項。

這些都是可能的值:

public enum EnumItemState 
{ 
    Default, 
    Red, 
    Green, 
    Yellow, 
} 

現在,我想在視圖中快速測試不同的值,所以我寫了 驗證碼:

private EnumItemState GetRandomItemState() 
    { 

     var rand = new Random(); 

     var val = rand.Next(0, 3); 

     switch (val) 
     { 
      case 0: 
       { 
        return EnumItemState.Red; 
       } 
      case 1: 
       { 
        return EnumItemState.Green; 
       } 
      case 2: 
       { 
        return EnumItemState.Yellow; 
       } 
      default: 
       { 
        return EnumItemState.Default; 
       } 
     } 
    } 

但它不是隨意的,在所有的。一次運行的所有值都是相同的。

在我的「隨機」方法的某個地方出現斷點時,我得到了不同的「更隨機的」 結果。

這裏發生了什麼?

如何獲得更好的隨機結果?

這是一些優化,所以我所有的Randoms都是用相同的時間種子創建的,因此得到相同的結果?

+0

原來如此。在 – 2013-03-20 20:03:14

回答

1

您每次調用正在使用相同值(基於當前時間)播種的方法時,都會創建一個新的隨機對象,以便繼續獲得相同的隨機值。

而是執行此操作:

void CallingMethod() 
{ 
    Random rnd = new Random(); 

    for (int i = 0;i < 200;++i) 
     EnumItemState state = GetRandomItemState(rnd); 
} 

private EnumItemState GetRandomItemState(Random rnd) 
{ 
    // Same code you had here, but don't create new instance of Random 
} 
+0

之前沒有找到答案幫我解決。謝謝! – 2013-03-20 20:07:17

0

我會假設你在一個緊湊的循環非常頻繁調用這個(即,小到電話之間沒有時間)

的默認構造函數用於Random看起來是這樣的:

public Random() : this(Environment.TickCount) 
{ 
} 

請參閱Environment.TickCount?如果您非常快速地嘗試新建多個Random實例(即,在該計數器更改之前),您將有效地獲得完全相同的隨機數序列 - 因此「PseudoRandom」。

你可以做的幾件事情之一:

  • 等待的呼叫之間,而
  • 在種子手動傳遞到構造函數
  • 使用的PRNG在System.Security命名空間
+0

非常感謝!這就是問題......通過外部隨機實例解決它 – 2013-03-20 20:08:03