[[20150124210738]] 『ランダム整数の生成』(りんりん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ランダム整数の生成』(りんりん)

excel2010 win7

こんにちは。

1から10までの重複しない整数をランダムで生成して、

cell(1,1)からcell(10,1)に代入する式を、net上で知りました。

しかし、いろいろ調べましたが、理解できない部分がありましたので、

ご教授願いたく投稿いたします。

以下は、その記述です。

Private Sub CommandButton22_Click()
Dim i As Long, myNum As Long

    Dim myFlag(1 To 10) As Boolean  

    '乱数系列を初期化
    Randomize

    For i = 1 To 10
        Do
            '乱数=Int((最大値 - 最小値 +1 ) * Rnd + 最小値)
            myNum = Int((50 - 1 + 1) * Rnd + 1)
        Loop Until myFlag(myNum) = False     ←?@この意味がわかりません

        Cells(i, 1).Value = myNum
        myFlag(myNum) = True           ←?Aこの意味がわかりません
    Next i

End Sub

?@はdo脱出の要件とおもっていますが、
変数myFlag(乱数)が「NO]なら・・ってことでしょうか?0なら?

?Aは「YES]でしょうか?

どうして重複がしなくなるかがわかりませんでした。。。

どなたかお願いいたします。

当方、あまり詳しくありません。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 myFlag は数値が既出かどうかを判定するためのフラグとして使っているようです。
 初期設定はされていませんが、値を入れない場合 Flase (0) なので、乱数で生成した数値が
 これまで出ていなければFalse、出ていれば True なので、もう一度乱数を生成し直すという
 ロジックです。

 同様の機能を実装するやり方は多数あると思いますが、検索で見つかった一例のご紹介まで。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_rnd.html
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_sortedlist.html 内の「ランダムに並べ替える」
(Mook) 2015/01/24(土) 22:01

 myFlag(1 To 10) なので

 myFlagは、10個の部屋に分けられています。

 i=1のループから考えると

 myNum = Int((10 - 1 + 1) * Rnd + 1)
 で、myNumが「5」だったとします。

 Do〜Loopのループを終える条件は、myFlag(5) = False です。

 最初はmyFlagのどの部屋にも何も書き込まれていないので、
 必ず False です。

 セルに myNum を書き出した後
 myFlag(5) = True
 5番目に True を書き込みます。 

   [1]   [2]   [3]   [4]   [5]   [6]   [7]   [8]   [9]   [10]
                           True

 i=2のループでmyNumが「8」だったとします。
 myFlag(8)も、何も書き込まれていないので Do〜Loopのループを終えます。
 セルに myNum を書き出した後
 myFlag(8) = True
 8番目に True を書き込みます。 

   [1]   [2]   [3]   [4]   [5]   [6]   [7]   [8]   [9]   [10]
                           True              True

 i=3のループでmyNumが「5」になったとします。
 すると、myFlag(5)は True です。
 そこで、もう一度 myNum = Int((10 - 1 + 1) * Rnd + 1) が実行され
 再度 myNum が決まります。

 5か8以外だったら、Do〜Loopのループが終わります。

 1〜50の間で 重複しない10個を書き出したいなら
 Dim myFlag(1 To 10) As Boolean  
 部屋を10個ではなく、50個作ってください。
 Dim myFlag(1 To 50) As Boolean 
  
(HANA) 2015/01/24(土) 22:09

早速のご回答、大変有難うございます。

追加の質問になり恐縮ですが、もし宜しければ教えてください。

既出かどうかを判定するということは、Randomizeを実行するまで、
どこかに情報がプールされている、という解釈で宜しいでしょうか?

「乱数が既出でない場合のフロー」

 Loop Until myFlag(myNum) = False ← 乱数が既出ではないので
 Cells(i, 1).Value = myNum    ←Doを抜けて、対象のセルに乱数を代入
        myFlag(myNum) = True   ←??(この乱数が既出だと認識させるということでしょうか?) 
                     =既出乱数プールにフラグをたてる?

蒸気のような解釈なのでしょうか?アホですみません↓

お願いいたします!     
(りんりん) 2015/01/24(土) 22:20


編集している間に、HANAさんから回答をいただいておりました。

有難うございます。

なお、お二方のおかげをもちまして、

理解いたしました。。

ご丁寧な回答、対応大変有難うございました。(^^)
(りんりん) 2015/01/24(土) 22:23


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.