1

基本的に、私がA = Array(1, 2, 3, 4, 5)やりたいことはRnd()、乱数の値に応じて、このループを一周することです。

基本的0 Mod 5に乱数を取得することから始めます。乱数が 0.5 未満の場合は にとどまりますが0 Mod 5、乱数が 0.5 以上の場合は に移動し1 Mod 5ます。次のステージに渡されるため、「再びロールする」ため、a を渡します。に到達できるかどうかを確認するために、それに新しい乱数を追加し2 Mod 5ます。

私の目標は、これを 10,000 回実行し、スプレッドシートの A 列に結果を収集してから、散布図をプロットしてその動作を確認することです。

今私は関数を作成しました

Function looper(R, i)
If R < 0.5 Then
    j = i
Else
    j = i + 1
End If
If j = i Then
    Exit Function
Else
    newR = Rnd()
    j = looper(newR, j)
End If
End Function

サブと合わせて

Sub loopy()
A = Array(1, 2, 3, 4, 5)
Randomize
R = Rnd()
k = looper(R, 1)
Cells(1, 1).Value = A(k Mod 5)

ただし、値 1 しか返されません。

ロジック、またはロジックを VBA コードに入れようとしている方法のいずれかで、何か根本的に間違っていると確信しています。

4

2 に答える 2

1

オンライン ルーレットのロジックを分析および/またはクラックしようとしていますか? ;)


関数looperは常に を返すように設計されてい1ます。
乱数が関数を再帰的に呼び出すよりも大きい場合でも0.5、簡単に言えば、新しい乱数がより小さい0.5場合は を返します1

だから私はあなたのためにこれを書き直しました、そしてこのコードはhow many random numbers greater than 0.5 can I get in a row- の結果を列 A
に出力します。

Option Explicit

Sub roulette()
    Dim ws As Worksheet, nextRow&, i&, max&
    Set ws = Sheets(1): ws.Cells.ClearContents
    For max = 1 To 10001
        nextRow = ws.Range("A" & Rows.Count).End(xlUp).Row + 1
        ws.Range("A" & max).Value = getStage
    Next max
End Sub

Function crack() As Boolean
    Dim x#: Randomize: x = Rnd()
    If x >= 0.5 Then crack = True
End Function

Function getStage() As Long
    Dim cnt&
    While crack: cnt = cnt + 1: Wend: getStage = cnt
End Function
于 2013-05-31T10:37:19.377 に答える
0

さて、私は自分の機能を変更しました

Function looper(i)
R = Rnd()
If R < 0.5 Then
    looper = i
Else
    looper = i + 1
End If
End Function

そして私のサブを変更しました

Sub loopy()
A = Array(1, 2, 3, 4, 5)
Cells(1, 1).Value = "Number"
For i = 2 To 10001
    k = 1
    j = 1
    While k = j
        j = looper(k)
        k = k + 1
    Wend
    Cells(i, 1).Value = A(j Mod 5)
Next i
End Sub

これは私が欲しいものを与えてくれます。しかし、私が常に教えられてきたループを含まないより良い方法を明るい火花が思い付くことができることを今期待していWhileます。可能な限り避けるべきです。

于 2013-05-31T10:14:24.857 に答える