2012-03-01 69 views
0

我必須在-1和1的範圍內生成一系列隨機數,比如說100,然後用一個值(比如2的平方根)對它們進行縮放。之後我拿這100個值和他們的總和= 0,然後用另一個值對這個總和進行縮放。檢查下面的代碼,看看我的意思。在VB.NET中生成隨機值並將它們加總爲零

Dim rand As New Random() 
Dim sum As Double = 0 
Dim kin As Double = 0 

For j As Integer = 0 To 99 
    rand.NextDouble() 
    Console.WriteLine(" {0} ", (rand.NextDouble() * 2 - 1) * Math.Sqrt(2)) 
    sum = sum + ((rand.NextDouble() * 2 - 1) * Math.Sqrt(2)) 
    kin = kin + Math.Pow(sum, 2) 
Next 
Console.WriteLine(sum) 
Console.WriteLine(kin) 

我不能得到的總和等於0的隨機分佈應該是均勻的,所以總和通常會(-1,1)之間0。 sum和kin都有100個值。

最終,我試圖計算動量守恆。

+1

'這樣你就知道隨機分佈應該是統一的,因此總和通常在0之間。它應該相當接近零,但從不「每次都是零」。有很好的變化,它不會*完全*零。 – vcsjones 2012-03-01 02:22:17

+1

事實上,它總計爲0的理論概率是... 0.不算數學樂趣嗎? – bdares 2012-03-01 02:24:46

+2

此外,您正在生成300個隨機數字。你應該把rand.NextDouble()的結果放入一個變量中嗎? – 2012-03-01 03:06:44

回答

0

NextDouble應該給你一個統一的分佈。這與說所有獲得的價值將平均爲平均值並不相同。

也許你看到的實際問題是kin未被正確計算。對於每次迭代,您都要添加sum^2。平方負數將總是產生一個正數,而且你在kin之外還會複製結果。如果你沒有總結kin,只是計算它循環後,即kin = Math.Pow(sum, 2),然後你會看到sum確實趨向於0。

此外,如在評論中提到的,你不正確使用您生成的隨機數字並重復計算。這裏是我推薦的修改:

Dim rand As New Random() 
Dim sum As Double = 0 
Dim kin As Double = 0 
Dim randomValue As Double 

For j As Integer = 0 To 99 
    randomValue = (rand.NextDouble() * 2 - 1) * Math.Sqrt(2) 
    Console.WriteLine(" {0} ", randomValue) 
    sum = sum + randomValue 
Next 

kin = Math.Pow(sum, 2) 

Console.WriteLine(sum) 
Console.WriteLine(kin)