1

重複の可能性:
1 つの乱数のみを生成する乱数ジェネレーター

vb.net では、この関数を使用して乱数を取得しています。

  Private Function GetRandom(ByVal Min As Integer, ByVal Max As Integer) As Integer
    Dim Generator As System.Random = New System.Random()
    Return Generator.Next(Min, Max)
  End Function

次のような別の関数から GetRandom 関数を数回呼び出しています (簡略化):

Public Sub GetRandomPerson() 
  Dim Gender as integer
  Dim Zip as integer

  Gender = GetRandom(1,3)
  Zip = GetRandom(10000, 99999)

  ' Here I save the random person to DB
End Sub

そして、私はこれを持っています

For i As Integer = 1 to 10000
  GetRandomPerson()
Next

私の問題は、GetRandom の呼び出しに依存しているように見えることです。Gender が 1 の場合、Zip は特定の値 (約 5000) を超えることはなく、Gender が 2 の場合、Zip は常に特定の値よりも高くなります。値 (約 5000)。

それはなぜですか、何が欠けていますか?

4

1 に答える 1

2

すべての呼び出しでインスタンス化Randomしています。これが、あなたが見ている結果を得ている理由です:

Dim Generator As System.Random = New System.Random()

Random現在の時間に基づくシードを使用して疑似乱数シーケンスを生成します (同じシードを持っている場合、同じシーケンスを生成します) - あなたが行うようにループで呼び出された場合、シードに 0 の変更がある可能性があります。何度も同じ値。

インスタンスを関数の外に移動して、ジェネレーターの単一のインスタンスのみを使用するようにします。

Jon Skeet によるRandomに関するこの記事を読むことをお勧めします。

于 2012-11-16T12:25:59.757 に答える