• ベストアンサー

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

.NETでタイピングゲームを作っています。 乱数を使って日本語とそのローマ字を1セットとして表示していくプログラムなんですが、どうしても同じものが出てしまうのですが、同じ日本語とローマ字のセットが表示されないようにするにはどうすればよいでしょうか? ちなみに、コード下記のように作りました。 Randomize() 乱数 = Math.Floor(Rnd() * 要素数) + 1 If 乱数 Mod 2 = 0 Then '乱数が偶数の時 Label1.Text = Typeword(乱数 - 1) '日本語表示 Label2.Text = Typeword(乱数) 'ローマ字表示   elseで、乱数が奇数の処理を行う。

noname#30978
noname#30978

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

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) 'ローマ字表示 で済みます。要素数で考えるからややこしくなるので、問題数で考え、余計な数値が出ないように考えましょう。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

#1の方のやり方がいいと思います。 乱数生成で余計な思考をしないで済みますし。 配列 シャッフル というキーワードで検索すると参考になるページが たくさん見つかると思います。簡単には配列を先頭からなめながら 乱数によって要素の入れ替えを行うということなのですが、数学的には きちんと「ランダムに」シャッフルするのは結構難しいようです。 参考URLにあるのは残念ながら Visual Basicではありませんが 考え方を知るのには参考になるでしょう。

参考URL:
http://www.fumiononaka.com/TechNotes/Flash/FN0212003.html
noname#30978
質問者

お礼

参考URLの内容を理解するのに時間がかかっていました。 考え方はおおまかにですが分かりました。 御回答ありがとうございました。

  • tatsumi01
  • ベストアンサー率30% (976/3185)
回答No.2

外しているかも知れませんが。 同じものが絶対に出ないのなら乱数ではありません。乱数という以上は同じものが出る可能性はあります。 同じ文字の組が二度出ないようにするには、文字組が決まるごとに表に登録し、乱数を振って文字が出たら表を参照して過去に出ていないことを確認すべきです。

noname#30978
質問者

お礼

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

  • JAWS55
  • ベストアンサー率38% (176/452)
回答No.1

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

関連するQ&A

  • 乱数とは・・・?

    質問なんですが、配列の中身が、( AA(10) ) AA(1) = "りんご" AA(2) = "ringo" AA(3) = "みかん" AA(4) = "mikan" …10まで日本語→ローマ字の繰り返し という形で、これを乱数でバラバラにして、AA(1)とAA(2)(同様に3と4)を一塊としてlabel 1,2に時間経過で表示したいのですが、 時間経過で表示は出来たのですが、乱数の使い方がよく分からないのでランダムに表示されません。 もしかしたら、1と2をセットとして表示というのは無理なんでしょうか?

  • ACCESSで乱数発生

    宜しくお願いいたします。 ACCESS2000でかるた取りゲームを作成しています。 かるたを任意に配置するために乱数を設定するのに Randomize DoCmd.RunSQL "update 回答 set 整列No.=100*rnd(1) " として、一応乱数が整列No.に張り付いているのですが常に同じ数列になっています。 数列を起動の都度変更するにはどのようにしますか

  • ラベルの文字列で乱数処理

    毎度こちらでお世話になっております。 早速iPhoneアプリ開発について質問させて頂きます。 現在、ラベルに入力したテキスト(数字)で乱数処理を 行いたいと思っているのですが、これは可能なのでしょうか。 他のサイトで調べたところほとんどがInt値で処理された 乱数となっていて、これをNSStringの文字列であるラベルテキスト で出来るものなのでしょうか。 具体的にあげると、 Label1~Label4の4つのラベル内に入力したテキスト(数字)を 乱数処理し、4つの数字が全部当たったらAlertで結果表示 となるような処理を考えています。 よろしくお願い致します。

  • 重複しない乱数発生

    初めて投稿させて頂きます。 サイコロを振って、一度出た目はもう出ないような ゲームをプログラミングしています。 Dim i As Integer Dim j As Integer Dim t As Integer Dim r(6) As Integer 'コンピュータ Dim b As Integer 'プレイヤー Private Sub Command1_Click() b = Val(Text2.Text) Randomize r(6) = Int(Rnd * 6 + 1) '1~6までの乱数発生 Text1.Text = r(6) For i = 1 To n r(i) = i 'r(i)~r(n)に1~nの値を格納 Next i For i = n To 2 Step -1 j = Int((i - 1) * Rnd() + 1) '1~i-1の範囲の乱数 t = r(i): r(i) = r(j): r(j) = t 'r(i)とr(j)の交換 Next i For i = 1 To n Text1.Text = r(i) Next i If r(i) < j Then Label2.Caption = "あなたの勝ちです" Else Label2.Caption = "あなたの負けです" End If 幾つか考えてこれで落ち着いたのですが、これでは まだ重複してしまいます。 どこが問題なのかご指摘頂けるようお願いします。 一度出た目は出ないようにするので、全部で6回試行 することになります。またその6回分の結果を表示したいのですが、 Text3.Text = r(1) Text4.Text = r(2) Text5.Text = r(3) Text6.Text = r(4) Text7.Text = r(5) Text8.Text = r(6) としてしまうと全てに0が表示され、結果が表示されません。 これについても回答をお願いします。 まだ初心者ですが、よろしくお願いします。

  • 実用的なタイピング

    自分は趣味でタイピングゲームをよくするのですが、毎日パソコン入力コンクールや、ワープロ検定などでは実用的なタイピングが求められますよね? 正確性もなきゃいけないし、漢字の変換効率も考えなければならないとかで大変そうなのですが、この変換効率ってのはどうやって鍛えればいいのでしょうか?あと、自分には致命的な欠陥がありまして、よくタイピングゲームだと日本語とローマ字の両方が表示されるじゃないですか。それでいつもローマ字を見て打っているのですが、ローマ字読みで打てても実用性が無いですよね。でも日本語を読んで打つとものすごい遅くなってしまうんです。日本語読みでのタイピングのスピードを上げるにはどうしたらいいですかね? 最終的には資格を取得していきたいんです。 よろしくおねがいします。

  • どっちを見ればいいのか

    タイピング練習ソフトって上部に日本語、下部に対応するローマ字が表示されますよね。 これはどっちをみながらタイピング練習した方がいいのでしょうか?

  • javascript 乱数が取得できない

    はじめまして。 一月ほど前から「パズルネット ソフィア」 http://www.pori2.net/js/number/4.html というサイトでjavascriptの基礎を学んでいるのですが、乱数 を扱う段階になって自分の作成したプログラム(以下) <html> <head> </head> <body onload="Mondai()"> <form name="quiz"> <input type="text" value="" > <input type="button" value="赤" onclick="Push(0)"> <input type="button" value="青" onclick="Push(1)"> <input type="button" value="黄" onclick="Push(2)"> <input type="button" value="緑" onclick="Push(3)"> <input type="button" value="白" onclick="Push(4)"> </form> <script type="text/javascript"> <!-- var col=new Array("red","bleu","yellow","green","white"); var Rnd; function Mondai(){ Rnd=Math.floor(Math.random() * 5 ); document.quiz.element[0].value=col[Rnd]; } function Push(num){ var n=parseInt(num); if( n==Rnd ){ Mondai(); }else{ alert("違います。"); } } // --></script> </body> </html> を実行してもテキストボックス内に何の値も表示されず 、ボタンを押しても「違います。」とだけしか出てきません。 ブラウザはfirefoxを使用しており、javascriptの設定もonに なっています。 カンマや鍵括弧などの記号にも打ち間違いがないかサンプル プログラムを参考にしながら確認してみたのですが、どこにも おかしな点はありませんでした。 サンプルプログラムは下記のとおりで、こちらは正常に実行されます。 <body onload="Mondai()"> <form name="quiz"> <input type="text" value=""> <input type="button" value="赤" onclick="Push(0)"> <input type="button" value="青" onclick="Push(1)"> <input type="button" value="黄" onclick="Push(2)"> <input type="button" value="緑" onclick="Push(3)"> <input type="button" value="白" onclick="Push(4)"> </form> <script type="text/javascript"> <!-- //色名の英単語を配列に入れる var col=new Array("red","blue","yellow","green","white"); //乱数を入れる変数 var Rnd; //テキストボックスに問題文(色名)を表示する関数 function Mondai(){ //0~4までの乱数を発生させる Rnd=Math.floor( Math.random() * 5 ); document.quiz.elements[0].value=col[Rnd]; } //正誤判定関数 function Push(num){ //引数を数字に変換 var n=parseInt(num); //正解なら次の問題を表示、間違っていたらアラートを表示する if ( n == Rnd ){ Mondai(); }else{ alert("違います!"); } } // --> </script> どなたかアドバイスをいただけないでしょうか? よろしくお願いします。

  • パソコンタイピングで・・

    普段はタイピングをローマ字入力で打っていてそこそこタッチタイピングが出来ます。 一般的にローマ字入力が多いと聞きましたが、日本語を打つのはかな入力のほうが早いと思うので挑戦してみたいと思うのですが、いまさらかな入力を練習するとやはり混乱して良くないですか?

  • エクセルで偶数か奇数かを調べるにはどうすればいいですか?

    エクセルで関数の入ったセルの答えが偶数か奇数かでセルの色を変えたいのですが、 そんなことはできるのでしょうか? 数値の入ったセルはMOD関数などで偶数or奇数の判断が出来るので、条件付書式で偶数セルと奇数セルの色分けが出来たのですが、 数式の入ったセルの答え(表示されている数値)が偶数か奇数かを判断することができず困っています。 もしかして不可能なことなのでしょうか? どなたかご指導下さい。よろしくおねがいします!

  • Visual Basic6.0を使用しています。

    Visual Basic6.0を使用しています。 質問なのですが、テキストラベル100個で、10*10の表を作りました。 その100個のラベルの一つ一つに3ケタ乱数を入れたいと思って、For文を使用したのですが、 エラーが出てしまいます。 For k = 5 To 104 Label(k).Caption = Int((999 - 100 + 1) * Rnd + 100) Next k ⇒このように作ったのですが、Label(k)のところをどのようにしたらいいかわからなくて困ってます。 文がわかりにくくて申し訳ないのですが、どなたかわかる方いらっしゃいましたらよろしくお願いします! LabelをFor文で回すこと自体できないのでしょうか? ちなみにFor文で回さずに一つ一つの表に乱数を入れるのは成功します。