2012-03-28 150 views
0

我已閱讀的Java和C++/C#之間的主要區別的地方之一就是Java的做一些事情,在運行時和C#確實在編譯時的東西。這是真的?如果是的話,你能解釋一下這一點嗎?編譯時與運行時,Java和C#

在C#,我創建了一個函數,它接受在兩個輸入,並返回一個隨機數(稱爲RandomNumber(int x, int y)),使用隨機的Object。然後我在另一個函數中調用這個函數兩次,期望得到兩個不同的值(兩個不同的隨機數)。但是,我始終得到相同的值,這讓我感到困惑,因爲我可以在Java中做同樣的事情,並期望得到不同的數字。

於是我決定,要刪除我的功能 - RandomNumber(INT X,int y)對,並調用隨機我的其他函數中,出現如下圖所示。

Random random = new Random(); 
    int randomNum; 
    int la; 
    randomNum = random.Next(1, 10); 
    numOne.Text = randomNum.ToString(); 
    la = random.Next(1, 10); 

這產生兩個不同的隨機數。爲什麼會這樣?

+3

http://stackoverflow.com/a/768001/284240將隨機實例傳遞給方法,因爲它調用得太快。 – 2012-03-28 17:36:54

+6

你問過兩個完全不同的問題。他們應該在兩個單獨的職位 - 或者,理想情況下,您將搜索並找到每個部分的各種重複問題的答案。 – 2012-03-28 17:37:10

+4

C++和C#是非常不同的語言,編譯時/運行時行爲有很大不同。 – 2012-03-28 17:37:35

回答

5

隨機數的問題無關編譯時或運行時。它與Random類的實例化有關。

Random類實際上並不生成真隨機數。它們是根據包含當前日期/時間和其他幾個數據位的數學公式生成的。

以下:

Random r = new Random(100) 
for(int i = 0; i < 100; i++) 
{ 
    Console.WriteLine(r.Netc().ToString()); 
} 

會產生一系列的數字,看起來是隨機的。

此:

for(int i = 0; i < 100; i++) 
{ 
    Random r = new Random(100); 
    Console.WriteLine(r.Next().ToString()); 
} 

會產生幾個循環相同的數字,然後幾個循環一系列新的類似的數字。

這是因爲公式。在第二個例子中,每個Random類都是以非常相似的條件創建的,因此會產生相同的數字,直到時間變​​化足以改變結果爲止。

然而,與第一例子中,只有一個Random類,並在循環的後續迭代,它知道不同而產生不同的數字,因爲它知道,它只是產生了一個在最後一個循環。

如果您的代碼調用該聲明的一個新的隨機對象的函數,然後使用Random.Next然後在您的函數的範圍,隨機爲每次調用一個新的對象。因此,如果你的電話在幾毫秒內,你會得到相同的結果。