前回、重複無しの乱数を生成できなかったべべちゃんは
コードを次のように書き直した。
%Y = 1
Randomize(thistime())
Cells(1, 1) = Int(Rand * 16) + 1
Do While %Y <= 16
%i = Int(Rand * 16) + 1
For %X = 1 To 16
If Cells(%X, 1) = %i Then
continue Do
End If
Next
Cells(%Y, 1) = %i
%Y = %Y + 1
Loop
【´・ω・`】:お~、べべちゃん、こんどはForループではなくて
Doループを使っているね。かなり、勉強しているとみたが・・・。
(●`ε´●):まあな。
【´・ω・`】:ちょっとDoループの解説をしてくれ。
(●`ε´●):OK。Doループは・・・
Do While 条件式
繰り返したい処理
Loop
・・・という書式をとる。上のDoループは条件式が成立する間は
ループすることになる。
【´・ω・`】:Forループとの違いは?
(●`ε´●):Forループは一般にループの回数が決まっているときに
用いてDoループはそうでないときに用いる。
【´・ω・`】:上出来だよ。それではもうひとつ、 continue Doについて
説明してくれ。
(●`ε´●): continue Doはループの開始地点に戻れという命令だ。
【´・ω・`】:うん、文法的なことはバッチリだね。それではコード全体の
流れを説明してくれ。
(●`ε´●):このコードは重複無しで1から16までの整数を生成して
それをワークシートのA列に書き込む。発想は単純。
まず、何でもいいから乱数を生成して、それをA1にぶちこむ。
つぎに生成した乱数をA1の数値と比較し、同じだったら違う乱数が
生成されるまでcontinue Doでループする。
【´・ω・`】:なるほど。
(●`ε´●):そうやってループしているうちにA1と違う数が生成されたら
それをA2にぶちこむ。つぎは三ツ目の乱数を生成し
それをA1,A2にいれた数と比較し、違う数が生成されるまで
ループする。......こうして16個乱数が生成されたら
ループを抜ける。
【´・ω・`】:べべちゃんらしいコードだな。若者らしくて元気があって好きだよ。
ひとつ、大事なことだけどこのコードだと最初に実行するときは
いいけど、2度目に実行するときA列に乱数が書き込まれたままだと
無限ループになってPCがクラッシュするから気をつけてね。
べべちゃんのコードの先頭にA列をクリアする初期化コードを
1行、付け加えて・・・
Range("A1:A16")="" !!くまぷーが付加した初期化コード
%Y = 1
Randomize(thistime())
Cells(1, 1) = Int(Rand * 16) + 1
Do While %Y <= 16
%i = Int(Rand * 16) + 1
For %X = 1 To 16
If Cells(%X, 1) = %i Then
continue Do
End If
Next
Cells(%Y, 1) = %i
%Y = %Y + 1
Loop
・・・とすれば問題ないと思うけど、重複無しの乱数を
生成するには定跡があるから紹介するよ。
(続く)
くまぷーさんが、
こんな時間に起きているなんて・・・
重複無しの乱数、
面白いですね。(^^)(^^)
あっちでも、話題にしてみようかしら (^^)ゞ
投稿情報: 悪児 | 2007年4 月 7日 (土曜日) 午前 03時43分
ははは、実は時間指定で
UPできるんです。(^。^)
>重複無しの乱数、
面白いですね。(^^)(^^)
有り難うございます。
あちらで誰かに「重複無しの乱数」は
言葉としておかしいと
指摘きされませんでしたっけ?
でもくまぷーは「重複無しの
乱数」という言葉は言いたいことが
伝わりやすいような気がして・・・
いまだに使っています。(^。^)
投稿情報: くまぷー | 2007年4 月 7日 (土曜日) 午前 06時31分