2012-03-01 15 views
0

-1と1の範囲で一連の乱数、たとえば100を生成し、2の平方根などの値でそれらをスケーリングする必要があります。その後私はそれらの100個の値とその合計= 0をとります。そして、その合計を別の値でスケーリングします。私が何を意味するかを確認するには、以下のコードをチェックしてください。ランダム値を生成してVB.NETでそれらを0に加算する

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) 

Iは、ランダム分布が均一であると想定されるので、加算は、通常(-1,1)との間に0になり0に等しくなるように和を得ることができません。 sumとkinの両方に100の値があります。

最終的に、私は勢いの保存を計算しようとしています。

+1

'ランダムな分布は均一であると考えられますので、合計は通常0になります。それはゼロにかなり近いはずですが、毎回ゼロになることはありません。正確にはゼロではない良い変化があります。 – vcsjones

+1

実際、0に合計する理論的確率は... 0です。数学は楽しいものではありませんか? – bdares

+2

また、300個の乱数を生成しています。 rand.NextDouble()の結果を変数に配置する必要がありますか? –

答えて

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) 
関連する問題