- ベストアンサー
VBAで重複なしの乱数を使った数比べゲームを作成する方法
- VBAを使用して重複のない乱数を生成し、数比べゲームを作成する方法について教えてください。
- ゲームのルールは、フォーム上に配置された0から9までのボタンを押すごとに乱数が表示され、選択した数字と乱数を比較し勝敗を決定するものです。
- 現在の問題は、ボタンを押すたびに重複のない乱数を取得する方法が分からないことです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> myFlag(myNum) = False や myFlag(myNum) = True の部分は必要なのでしょうか 重複させないために必要です。 乱数はボタンを押す前に10個作っておきますから、ボタンを押したときの処理に何か間違いがあるのではないかと思います。 一番考えられるのは myRnd と j がグローバル変数にしてないのではないかと思います。 例えば下記のような構造になっていますか。 Dim myRnd(9) As Integer Dim j As Integer j= 0 Sub Sub Sample() '乱数の発生と myRndへの格納 Dim i As Integer, myNum As Integer Dim myFlag(9) As Boolean For i = 0 To 9 Do Randomize myNum = Int(Rnd * 10) Loop Until myFlag(myNum) = False myRnd(i) = myNum myFlag(myNum) = True Next End Sub Sub BtnClick() 'myRnd(j)の表示 表示場所 = myRnd(j) j = j + 1 End Sub
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17070)
乱数と言うのは、同じ値も発生してこそ、乱数でしょう。省いたら厳密には乱数でなくなるのでは。 質問のようなことをやると、乱数と唱えているだけで、ただの自己満足でしょう。 乱数を数学的に勉強してください。または数学のカテゴリで、数学の識者に質問したら。 でも回答があっても、それを理解できないだろうと思うが。 ーー それより重複のない連番などをつくり、別(隣)列に乱数をだし、その列で元データとともにソートし、上から1つづつ元のデータ(乱数でない)を順に採り上げていく、方が良いのでは。
- samtomsan
- ベストアンサー率55% (1060/1897)
参考のプログラムで考えると 追加 Dim myRnd(9) As Integer 下記を変更 Range("A1").Offset(i).Value = myNum + 1 myRnd(i) = myNum で myRnd に0~9の数値が入ります。 0~9のボタンをそれぞれは一回しか押してはいけなければ、 0を押した -> myRnd(0)を表示 1を押した -> myRnd(1)を表示 ・・ 9を押した -> myRnd(9)を表示 同じボタンを押しても良いのであれば、変数jを導入して Dim j As Integer 初期値 j = 0 0を押した -> myRnd(j)を表示 j = j + 1 1を押した -> myRnd(j)を表示 j = j + 1 ・・ 9を押した -> myRnd(j)を表示 j = j + 1 でできると思います。
お礼
迅速な対応本当にありがとうございます!! 参考にしてみましたが、ボタンを2回目押したときに毎回フリーズしてしまいうまく動きません;; 参考URLの myFlag(myNum) = False や myFlag(myNum) = True の部分は必要なのでしょうか? 回答お願いいたします;;
- kagakusuki
- ベストアンサー率51% (2610/5101)
0~8までの乱数を発生させてから、その値に1を足して1~9の乱数とし、それをボタンで選択した0~9の値に加えた上で、MOD関数等を用いて、10で割った時の余りを求めれば良いのではないでしょうか。
- samtomsan
- ベストアンサー率55% (1060/1897)
0~9で重複しないということですと、ボタンを10回押すと終わってしまいますが、それでよいのでしょうか。 そうならば10個の乱数を入れる変数にあらかじめ重複しない乱数を入れておき、0~9のボタンを押したら配列の数字を表示すれば良いと思いますが。 下記のセルに表示する代わりに配列に入れておけば良いということになります。 http://www.moug.net/tech/exvba/0050060.htm 目的と重複しないという前提が違っているような気がしますが。
補足
回答ありがとうございます!! ボタンを10回押すとゲームが終了で大丈夫です。 参考URLを見たのですが、配列に入れるというのがいまいち分かりません。 もう少し詳しくお答え願いたいと思います;; よろしくお願い致します。
- YUI_AI
- ベストアンサー率45% (303/661)
Randomizeを使用すればよいのではと思います。 外していたらごめんなさい。 使用例 http://www.officetanaka.net/excel/vba/statement/Randomize.htm
お礼
上記のプログラムを参考に書く順序を直しながらプログラムに組み込んでみたら 重複なしの乱数を取得することができました。 何度も質問に答えていただき、本当にありがとうございました!!