2

サンプリング ツールを作成しようとしています。

0 から 3000 の間でランダムに生成された数字を 500 の倍数で選択して、それらの合計が固定数 (12 スロットで 10000 など) になるようにする必要があります。

その上で、約 100000 から 1000000 までの複数回の反復を実行する必要があります (まだ決定されていません。

私のアプローチは、2 次元配列を作成し、反復の合計を検証するための制約を設定し、条件が真の場合にのみそれを最終的なデータ サンプルに入力することです。

私は次のコードでいくつかの非常にひどい間違いを犯しています...

Public Sub Generatenums()
    Dim GRP() As Long, Random() As Long
    Dim RandomTotal As Long, t As Long, w As Long, i As Long, j As Long

    ReDim GRP(1 To 100, 1 To 12)
    ReDim Random(1 To 12)

    For i = 1 To 100
        For j = 1 To 12
            Random(j) = Int(Rnd() * 7) * 500
            RandomTotal = RandomTotal + Random(j)
        Next j

        If RandomTotal = 10000 Then
            For k = 1 To 12
                GRP(i, k) = Random(k)
            Next k
        End If
    Next i

    Range("A1").Select
    For t = 1 To 100
        For w = 1 To 12
            Cells(t, w).Value = GRP(t, w)
        Next w
    Next t
End Sub
4

1 に答える 1

3

Fantomさん、SOへようこそ。

コメンターは正しいです。これは実行に非常に長い時間がかかります。

これを特定の金額を埋めるための配列と考えるのではなく、20 個のボールが跳ね返って下部のビンに収まるパチンコまたはガルトン ボードと考えてください。なんで20?500 ずつ 10000 の合計が必要なため、10000/500 = 20 を 1 つのボールと見なします。

これで、プログラムは線形時間で実行できます。合計をランダム化するのではなく、ボールが 12 個のスロットのどれに落ちるかをランダム化します。次に、各スロットにあるボールの数に 500 を掛けると、合計は常に 10000 になります。

ループの 1 つは次のようになります。

For i = 1 To 20
  x = Rnd() * 12 + 1
  If x > 12 Then x = 12
  If x < 1 Then x = 1
  bin(x) = bin(x) + 1
Next i

問題を解決するにはそれで十分ですか、それとももっと必要ですか?

于 2012-06-21T18:45:22.640 に答える