2014-01-31 74 views
0

我創建了一個名爲x一個Random類對象for環內,呼籲x.next(1,7)應返回16,對象創建和x.next()功能之間的變量放在裏面的for循環會發生什麼其執行,而不是返回隨機變量5倍它返回在每個迭代當在C#對象變量聲明爲靜態

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      for(int i=1;i<=5;i++) 
      { 
       Random x = new Random(); 

       Console.WriteLine(x.Next(1,7)); 
      } 

     } 
    } 
} 

我的輸出如下

5 
5 
5 
5 
5 
相同的值

當我把外循環的對象聲明它每次迭代

using System; 


     namespace ConsoleApplication1 
     { 
      class Program 
      { 

       static void Main(string[] args) 
       { 
        Random x = new Random(); 
        for(int i=1;i<=5;i++) 
        { 


         Console.WriteLine(x.Next(1,7)); 

        } 

       } 
      } 
     } 

這一次我的輸出是

4 
5 
9 
3 
1 

在返回隨機變量,也當x聲明爲類的靜態變量的作品程序如下

using System; 


    namespace ConsoleApplication1 
    { 
     class Program 
     { 
      static Random x = new Random(); 
      static void Main(string[] args) 
      { 

       for(int i=1;i<=5;i++) 
       { 


        Console.WriteLine(x.Next(1,7)); 

       } 

      } 
     } 
    } 

現在輸出的是

4 
7 
3 
7 
9 

,但我想知道爲什麼當物體在循環 內聲明它返回相同的值,並在對象變量聲明爲靜態的,會發生什麼?

+0

我想知道當對象變量(這裏是x)被聲明爲一個類的靜態變量(這裏是程序)時發生的具體情況。 –

回答

4

發生這種情況是因爲Random的默認構造函數使用種子的當前系統時鐘時間。由於系統時鐘時間每秒只更新幾次,如果在緊密循環中構建大量的Random對象,它們將被創建得如此之快以至於系統時鐘時間並沒有改變,從而導致它們使用相同的種子。

如果兩個Random對象使用相同的種子構建,它們將生成相同的隨機數序列。這就是你所看到的。

+1

非常好的答案,我不知道。嘗試了示例代碼,但是使用了100,000循環,並且您確實開始看到最終會出現一些不同的數字,但它們仍然是長度相同的數字,這些數字仍然會與上述說明相匹配。 –

+0

@Gurukulum:由於您在用於系統時鐘時間的代碼中使用的隨機類,輸出會有所不同。 – SkoolBoyAtWork