2017-05-25 67 views
0

我希望使用隨機類獲得隨機值,每次應用程序運行時都是相同的,並且只有在更改種子值或初始化隨機類時纔會有所不同。每次應用程序運行時隨機類C#打印值相同

我聲明Random random = new Random();作爲一個全局參數。

然後我打印3個隨機雙打:

for (int i = 0; i < 3; i++) 
Console.WriteLine(random.NextDouble()) 

每次應用程序運行時我得到不同的值

比如我第一次運行的應用程序,我得到的值 0.454,​​0.256,0.100

第二次 0.578,0.123,0.001

但我想要的是每次應用程序lication運行我會得到相同的數字

比如我第一次運行的應用程序,我得到 0.454,​​0.256,0.100 第二次 0.454,​​0.256,0.100

+0

也許你的實現在內部使用一個隨機種子本身,當你沒有指定一個(例如:使用當前時間戳)。如果您想確保每次都獲得相同的結果,請自行提供自己的種子 – KABoissonneault

+1

https:// msdn。microsoft.com/en-us/library/ctssatww(v=vs.110).aspx「爲不同的Random對象提供相同的種子值會導致每個實例產生**相同的隨機數序列**。這通常是在測試依賴隨機數字生成器的應用程序「。 –

+0

嗯,你說的'全局參數'是什麼意思?一個類級變量,也許? – TaW

回答

7

提供種子,如1隨機構造函數,雖然它可以是任何號碼:

Random random = new Random(1); 

現在每次你會得到相同數量的,所以它不會是隨機的。如果您不提供它,默認情況下會將當前時間戳作爲種子,因此您可以通過控制種子來控制值。

下面是一個完整的解決方案:

static void Main(string[] args) 
     { 
      Random random = new Random(1); 


      for (int i = 0; i < 3; i++) 
       Console.WriteLine(random.NextDouble()); 

      Console.Read(); 
     } 

OUTPUT:

0.248668584157093 
0.110743977181029 
0.467010679872246 
+1

也許可以解釋爲什麼默認構造函數的行爲與提供常量種子的行爲不一樣 – KABoissonneault

+0

對不起,我試過但仍然得到不同的值。 – Petras

+0

不,它不會!如果你從相同的種子獲得不同的值,那麼你的隱藏代碼就在某處! – TaW

2

當初始化Random類。爲構造函數提供相同的種子。

例子:

Random random = new Random(0); 

這會給你每次運行程序時相同的值。

這是因爲默認的構造函數提供了從系統時鐘派生的種子值,並具有有限的分辨率。

+0

這是一個很棒的評論,但回答很差。試着用一些更多的數據來加厚它,或許是一個代碼示例。 –

+0

對不起,我試過這個,但仍然得到不同的值。 – Petras

+1

答案是正確的。顯示代碼! – TaW

3

你可以選擇一個硬編碼的種子在你Random constructor

當初始化Random類,這樣做

var random = new Random(0); 

種子是Random初始狀態。默認情況下,它取決於系統時鐘,所以每次在應用程序運行中對其進行初始化時,它都會得到一個新的種子並具有不同的行爲。通過選擇一個靜態種子,它將表現相同。

相關問題