2011-03-27 69 views
7


這是我如何使用隨機數,但它總是給indexOfAChosenListCell提供「1」索引。
當我調試它,它表現出不同的值,但定期運行,每次我得到同樣的舉動..
什麼是隨機的問題,這是靜態不是隨機的... :)Random.Next不給隨機數

internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 
      Random randomListCell = new Random(); 
      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
+1

提示創建新的對象?另外,移動你的Random的外部構造getAutomaticMove() – 2011-03-27 00:50:31

+0

@Mitch:謝謝你的回答,但是LegalMovesArray.Count-1有什麼問題,我想拋棄LegalMovesArray中的一個索引,它沒有索引whi等於LegalMovesArray.Count ... – Mulder 2011-03-27 01:04:56

回答

4

我會建議播種隨機數發生器。據我所知,每次運行應用程序時,您都會得到相同的僞隨機數序列。我可能錯了。

int Seed = (int)DateTime.Now.Ticks; 
Random randomListCell = new Random(Seed); 
+0

你是對的!沒有你的兩行它不工作.. – Mulder 2011-03-27 08:41:24

+8

這並沒有什麼區別* - 這是默認構造函數new Random()在內部完成的。關鍵是隻初始化'randomListCell'一次,然後在這個實例上調用'Next()'。 – BrokenGlass 2011-03-27 16:03:06

+0

@BrokenGlass:我同意,他應該創建一個實例變量,並且你的答案是正確的。我不知道默認的構造函數會自動執行此操作。根據我的經驗,我不得不種子。這不就是爲什麼有一個構造函數需要種子嗎?我只是增加了對話。 – Anx 2011-03-27 17:31:52

5

Random.Next(Int32)

返回非負隨機數小於指定的最大

所以你所得到的最大數字是Count - 2,可能不是你想要的。

+0

我想要一個數字從0到array-1的大小,這意味着最後一個單元格 – Mulder 2011-03-27 01:08:31

+0

@Mulder:那麼你需要調用'randomListCell.Next(array.Length)',因爲RNG將已經排除你通過它的值,不需要減去1. – 2011-03-27 01:28:31

4

將Random聲明爲私有成員變量,然後將其實例化爲構造函數,並且只在方法中調用Random.Next。

3

你應該隨機函數外創建

Random randomListCell = new Random(); 

internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 
      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
21

使randomListCell一個實例變量,只有將其初始化一次 - 否則你將繼續再次收到同樣的號碼。

MSDN

默認情況下,Random類的參 構造函數使用 系統時鐘產生它的種子 價值,而它的參數 構造可以基於在一個Int32值 當前時間 中的刻度數。 然而,由於時鐘具有有限的分辨率,使用參數構造來創建緊密相繼 不同的隨機的對象創建的隨機數 發電機產生相同的隨機數 序列。

3

每當你需要一個新號碼時,不要創建一個新的Random;如果你想要一個不同的隨機數序列,你需要保留一個Random對象,並重復地詢問它。

2

我示區別:

var random = new Random(); 
var color = Color.FromArgb(200, random.Next(255), // 222 
           random.Next(255), // 33 
           random.Next(255)); // 147 

結果:#DE2193

var color = Color.FromArgb(200, new Random().Next(255), // 153 
           new Random().Next(255), // 153 
           new Random().Next(255)); // 153 

結果:#999999

0

聲明Random對象之外的功能,使之使用相同的對象來生成新的號碼。什麼是LegalMovesArray.Count-1的值:您是在每天使用該相同的種子,讓您大都相同數字的時間...

static Random randomListCell = new Random(); 
internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 

      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
}