こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

乱数で同じものが出ない処理ってどうやるんですか?

.NETでタイピングゲームを作っています。
乱数を使って日本語とそのローマ字を1セットとして表示していくプログラムなんですが、どうしても同じものが出てしまうのですが、同じ日本語とローマ字のセットが表示されないようにするにはどうすればよいでしょうか?
ちなみに、コード下記のように作りました。

Randomize()
乱数 = Math.Floor(Rnd() * 要素数) + 1

If 乱数 Mod 2 = 0 Then '乱数が偶数の時
Label1.Text = Typeword(乱数 - 1) '日本語表示
Label2.Text = Typeword(乱数) 'ローマ字表示
  elseで、乱数が奇数の処理を行う。

投稿日時 - 2006-12-18 12:26:30

QNo.2609801

すぐに回答ほしいです

質問者が選んだベストアンサー

1ゲームで10回出題とか、1ゲーム20回出題とか、出題回数が決まってる筈です。

その「1ゲームでの出題回数」分の配列を用意し、そこに出た乱数を記憶しておきましょう。

ゲーム開始時の処理:「今、何回目か?」を覚える変数を1にして、配列の全ての要素を「-1とか、有り得ない数値」に初期化します。

1回目の出題を選ぶ処理:乱数を作ったら、配列の全要素と順に比べていって、同じ物が1つも無かったら、今までと同じ処理をして、最後に「配列の1番目」に出た乱数を記録しておく。配列の中に同じ物があったら、乱数を作る所からやり直す。

2回目の出題を選ぶ処理:乱数を作ったら、配列の全要素と順に比べていって、同じ物が1つも無かったら、今までと同じ処理をして、最後に「配列の2番目」に出た乱数を記録しておく。配列の中に同じ物があったら、乱数を作る所からやり直す。実は2回目の処理は1回目の処理と何も違わない。

3回目以降の出題を選ぶ処理:1回目、2回目と同様の処理をする。

注意しないとならないのは「問題文の総数≧1ゲームの出題回数」になってないといけない、と言う事。もし、1ゲームの出題回数が問題文の総数より多かったら、全部の問題文を使い切った後、次の問題文を選ぶ時に「どの乱数が出ても既に使われていると判定されて、乱数の作り直しを繰り返して止まらなくなる」と言う状態になります。

以下、蛇足だけど。

乱数を奇数、偶数で分ける必要はありません。

問題が、
Typeword(1):日本語
Typeword(2):ローマ字
Typeword(3):日本語
Typeword(4):ローマ字
(略)
Typeword(29):日本語
Typeword(30):ローマ字
の時、要素数は30ですが、問題数は15です。なので

乱数 = Math.Floor(Rnd() * 15) * 2 + 1

とやれば、出て来る乱数は、1、3、5、…、27、29です。偶数は出ません。あとは、

Label1.Text = Typeword(乱数) '日本語表示
Label2.Text = Typeword(乱数 + 1) 'ローマ字表示

で済みます。要素数で考えるからややこしくなるので、問題数で考え、余計な数値が出ないように考えましょう。

投稿日時 - 2006-12-18 13:13:00

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

#1の方のやり方がいいと思います。
乱数生成で余計な思考をしないで済みますし。

配列 シャッフル というキーワードで検索すると参考になるページが
たくさん見つかると思います。簡単には配列を先頭からなめながら
乱数によって要素の入れ替えを行うということなのですが、数学的には
きちんと「ランダムに」シャッフルするのは結構難しいようです。

参考URLにあるのは残念ながら Visual Basicではありませんが
考え方を知るのには参考になるでしょう。

参考URL:http://www.fumiononaka.com/TechNotes/Flash/FN0212003.html

投稿日時 - 2006-12-18 14:46:57

お礼

参考URLの内容を理解するのに時間がかかっていました。
考え方はおおまかにですが分かりました。

御回答ありがとうございました。

投稿日時 - 2006-12-21 00:13:53

ANo.2

外しているかも知れませんが。
同じものが絶対に出ないのなら乱数ではありません。乱数という以上は同じものが出る可能性はあります。

同じ文字の組が二度出ないようにするには、文字組が決まるごとに表に登録し、乱数を振って文字が出たら表を参照して過去に出ていないことを確認すべきです。

投稿日時 - 2006-12-18 13:05:40

お礼

御回答ありがとうございます。
乱数の意味を勘違いしていました。すいません。

投稿日時 - 2006-12-21 00:00:26

ANo.1

私だったら、ローマ字と日本語のセットのテーブルの順番をを乱数で並び変える初期処理を行ってから、テーブルを順番に表示していきます。

投稿日時 - 2006-12-18 13:00:49

あなたにオススメの質問