重複しない乱数を作成しているのですが・・・

解決


MONO  2005-10-24 18:49:47  No: 126773

4桁の数字をRnd関数を使って作成しています。1123のように4桁の中に同じ数字が出ないようにしたいと思っています。まず配列を使って乱数を一つづつ入れていき、条件判断で隣同士の数字を比べ同じ数字だったら乱数をつくり直すというようにしているのですが同じ数字が出てしまいます。過去ログも拝見しましたがよく理解できませんでした・・・。本当に初心者な事で申し訳ないのですがよろしくお願いします。

Dim strRndnum(3) As String
For i = 0 To 3
        Randomize
        strRndnum(i) = Int(Rnd * 10)  '乱数を発生させる
    Next i
    
    For i = 0 To 2
        For j = i + 1 To 3
            If strRndnum(i) = strRndnum(j) Then
                Randomize
                strRndnum(j) = Int(strRndnum(j) * Rnd)
            End If
        Next j
    Next i


GOD  2005-10-24 19:12:04  No: 126774

一例としてサンプルとして投稿しときます。
説明するの面倒だからデバッグして数値がどのように変化しているのか理解して
ください。ウォッチウィンドウとかで数値の変化を確認すれば流れが掴めるかと。
後、頭が0になる場合があるけど嫌なら適宜、変更して。

Private Sub Form_Load()
    Randomize
End Sub

Private Sub Command1_Click()
    Dim lngCount As Long
    Dim lngCount2 As Long
    Dim lngNum(9) As Long
    Dim lngDmy As Long

    '初期値設定
    For lngCount = LBound(lngNum) To UBound(lngNum)
        lngNum(lngCount) = lngCount
    Next
    '数字を混ぜる
    For lngCount = LBound(lngNum) To UBound(lngNum)
        lngCount2 = Int(Rnd * 10)
        lngDmy = lngNum(lngCount2)
        lngNum(lngCount2) = lngNum(lngCount)
        lngNum(lngCount) = lngDmy
    Next
    Debug.Print lngNum(0) & lngNum(1) & lngNum(2) & lngNum(3)
End Sub


名無し  2005-10-24 19:39:01  No: 126775

要はトランプのシャッフルだよね。


MONO  2005-10-24 20:36:53  No: 126776

GODさん、名無しさんレスありがとうございます。
GODさんのサンプルソースで4桁数字が被らずに表示できますが、今自分が作っているプログラムに使用するとしてもだいたいの動きは理解できるのですが、どう入れていいのかわからないです・・・。でもこういうやり方もあるんだと思いました。


ささ  2005-10-24 21:04:58  No: 126777

> どう入れていいのかわからないです・・・。

どう入れてよいか分からないということは
理解できていない!と通常は判断していますが・・・。


MONO  2005-10-24 22:16:24  No: 126778

どういれていいかわからないというのはサンプルの変数と自分の作成しているプログラムの変数のどの名前になるのかとか、皆さんから言わせればもっと考えればわかるだろ。と思われるかもしれませんが・・・


ガッ  2005-10-24 22:28:31  No: 126779

ヒント:

> サンプル変数と
> 自分の作成しているプログラムの変数のどの名前になるのかとか
必要なのはプログラムの挙動だけ、変数の名前なんてどうでもいいです。
考えるべきなのは↓のことだけです。

機能化するために、関数として分離しなければならない。
・入力はなくていい
  →この情報から、関数の形は
      function foo() as ...
    と想像できます。
・出力は4桁の数字の組
  →内部の主な処理はGODさんが既に書いておられますので、
    あとは、イミディエイトウィンドウに出力するのではなく、
    関数の戻り値として設定してあげればいいだけですから、
      foo=lngNum(0) & lngNum(1) & lngNum(2) & lngNum(3)
    となります。

ヒントでした。


M  2005-10-24 23:04:49  No: 126780

皆さんレスありがとうございました。なんとか解決できそうです!!
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加