- ベストアンサー
乱数の重複無しを作りたい
- 乱数の重複を防ぐ方法について質問しています。
- ビンゴゲームのくじに使用するため、重複のない乱数生成を希望しています。
- 初心者向けの実践的なサンプルコードを教えてほしいという要望です。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
まず初期化については、"//-->" と書かれたところの1つ上の行に、下記を追加してください。 function myrandomize() { alreadyGet = new Array(); document.all.number1.innerHTML = ""; document.all.number2.innerHTML = ""; } ちなみに文字の大きさとかは、センスの問題なんで実際に動作確認してみて問題なければいいと思います。 それと番目を入れる件に関しては、補足していただいたソースプログラムを混ぜるとややこしいことになるので、無視して考えました。 まず "参加人数 5名です。<br>" と書かれているところのすぐ下に、 <span id="number3"></span> これを追加します。 次に、 document.all.number2.innerHTML = "今回の当選者:" + nameList[num] + "<br><br>前回の当選者<br>" + tmp; この部分のすぐ下に、 document.all.number3.innerHTML = "現在:" + alreadyGet.length + "/" + MAX_NUM + "人"; これを追加します。 ちなみに日本語で書かれた部分は、スクリプト内にあるものであっても、いかように弄ってもらっても構わないです。
その他の回答 (6)
んー。 その(1)と(2)の2つだけならHTML部分を弄れば何とかなりそうな気がするんですが、そういうことではないんでしょうか?
お礼
本当にお世話になり、ありがとうございました。 自分でも調べてみましたが、やはり無理そうです。 一度締め切って、JavaScriptで出直そうと思います。 deagle様のおかげで、すばらしいものができ、本当に感謝しています。 ありがとうございました。
補足
同じ人にポイントを差し上げることが出来ないのがとても残念です。 100ポイント以上差し上げたいくらいです。 ほんとうにありがとうございました。
まず(1)をやるには、#4の改変でできた下記の部分 document.all.number2.innerHTML = nameList[num] + "<br>" + tmp; を、さらに次のようにします。 document.all.number2.innerHTML = "今回の当選者:" + nameList[num] + "<br><br>前回の当選者:<br>" + tmp; んで、次に(2)については、少し上あたりにある下記の2文 for ( i = 0; i < alreadyGet.length; i++ ) { tmp += alreadyGet[i] + ","; ここを、下記のようにします。 for ( i = alreadyGet.length - 1; i >= 0 ; i-- ) { tmp += alreadyGet[i] + " " + nameList[alreadyGet[i]] + "<br>"; これで多分、使用に耐えるものができたと思うんですが(^_^;
お礼
ほんとうにありがとうございます。またお願いが… 最後FIN!まで出たあとなど初期化するボタンをつけたいのですが… 中に書くプログラムをどこにどのように書くかわかりません… 下記のようにすこしフォント等変更させて頂いた個所などもありますが これでいいのでしょうか? 本当に重ね重ねもうしわけありませんが、よろしくお願いいたします。 <html><head><title>乱数発生器</title></head> <body> <script language="javaScript"> <!-- var MAX_NUM = 5; var alreadyGet = new Array(); var nameList = new Array(MAX_NUM+1); nameList[1] = "巻 誠一郎"; nameList[2] = "大黒 将志"; nameList[3] = "玉田 圭司"; nameList[4] = "高原 直泰"; nameList[5] = "柳沢 敦"; function getNumber() { if ( alreadyGet.length >= MAX_NUM ) { document.all.number1.innerHTML = "FIN!"; return -1; } while ( true ) { num = Math.floor( Math.random() * ( MAX_NUM ) ) + 1; for ( i = 0; i < alreadyGet.length; i++ ) { if ( alreadyGet[i] == num ) break; } if ( i == alreadyGet.length ) break; } alreadyGet.push(num); document.all.number1.innerHTML = "" + num; tmp = ''; for ( i = alreadyGet.length - 1; i >= 0 ; i-- ) { tmp += alreadyGet[i] + " : " + nameList[alreadyGet[i]] + "<br>"; } document.all.number2.innerHTML = "今回の当選者:" + nameList[num] + "<br><br>前回の当選者<br>" + tmp; } //--> </script> <table><tr><td colspan="2" style="font:20px"> 参加人数 5名です。<br> <br> <input type="button" value="初期化する。" onclick="myrandomize()" style="font:10px"> <input id="button1" type="button" value="クリック!!" onclick="getNumber()" style="font:20px"><br> <span style="font-size: 200pt"><span id="number1"></span></span><br> <span style="font-size: 50pt"><span id="number2"></span></span> </body></html>
補足
すみません。あと、今何番目の番号なのかいれることはできますか?実は、わらをつかむつもりで、他のサイトにも問い合わせしてしまい、お答えを頂いたのですが、会社のほうで、これとこれを合せた感じがいいと言われてしまって…すみません。参考にしていただければと、そのプログラムのコードを下記記載します。お手数かけて本当に本当に申し訳ありません。よろしくお願い致します。 <html><head> <title>乱数発生器</title> <script language="JavaScript"> <!-- var nums = new Array(999); var nownum = 0; var limitnum = 0; var deflimitnum = 150; function getRandome() { if( nownum == limitnum ) { alert("すべて出力しました。"); } else { nownumvalue3.value = nownumvalue2.value; nownumvalue2.value = nownumvalue1.value; nownumvalue1.value = nums[nownum++]; nownumarea.value = nownum; if( eval(nownumvalue1.value) <= eval(limitnum) ) { list[nownumvalue1.value - 1].checked = true; list[nownumvalue1.value - 1].disabled = true; } } return nums[nownum]; } function myrandomize() { if( deflimitnum != 0 ) { maxnum.value = deflimitnum; deflimitnum = 0; } limitnum = maxnum.value; for( i=0;i<999;i++ ) { nums[i]=i+1; } for( i=0;i<limitnum;i++ ) { nownum = Math.floor( Math.random() * eval(limitnum) ); work = nums[nownum]; nums[nownum] = nums[i]; nums[i] = work; list[i].checked = false; list[i].disabled = false; } for( ;i<list.length;i++ ) { list[i].checked = true; list[i].disabled = true; } nownum = 0; nownumvalue3.value = "0"; nownumvalue2.value = "0"; nownumvalue1.value = "0"; nownumarea.value = "0"; alert( limitnum + "までの乱数を初期化しました。"); } function opensesame() { for( i=0;i<limitnum; ) { putstr = ""; for( j=i,k=0;(j<limitnum)&&(k<50);j++,k++ ) { putstr = putstr + "[" + (j+1) + "] " + nums[j] + ", " ; if( k%3 == 2 ) putstr = putstr + "\r\n"; } alert( putstr ); i+=k; } } // --> </script> </head> <body onload="myrandomize()"> <table><tr><td valign="top"> 1~<input type="text" name="maxnum" size="3" maxlength="3" value="999">の乱数を発生させます。<br> <input type="button" value="発生させる。" onclick="getRandome()"> <br> <br> <table><tr><td colspan="2"> 現在 <input type="text" size="3" value="0" name="nownumarea" readonly> 番目の番号です。 </td></tr><tr><td style="text-align:right; font:30px;"> 今回: </td><td> <input type="text" size="3" value="0" name="nownumvalue1" readonly style="font:30px"> </td></tr><tr><td style="text-align:right; font:30px;"> 前回: </td><td> <input type="text" size="3" value="0" name="nownumvalue2" readonly style="font:20px"> </td></tr><tr><td style="text-align:right; font:30px;"> 前々回: </td><td> <input type="text" size="3" value="0" name="nownumvalue3" readonly style="font:20px"> </td></tr></table> <br> <br> <br> <input type="button" value="初期化する。" onclick="myrandomize()"><br> <input type="button" value="すべて表示する。" onclick="opensesame()"> </td><td valign="top"> <script language="JavaScript"> <!-- document.open(); document.write( "<table><tr>" ); if( deflimitnum == 0 ) { listnum = 999; } else { listnum = deflimitnum; } for( l=0;l<listnum;l++ ) { document.write("<td align=\"right\">"); document.write("[" + (l+1) + "]"); document.write("<input type=\"checkbox\" name=\"list\" readonly>"); document.write(" </td>"); if( l%10 == 9 ) { document.write("</tr><tr>\r\n"); } } document.write("</tr></table>"); document.close(); // --> </script> </td></tr></table> </body></html>
>名前が出るようにはなりますか? えとですね。 それをやるためには、JavaScript の中に名簿を作っておかなければいけません。 1.#3のソースの "var alreadyGet = new Array();" と書いてある次の行に、下記の文を追加します。 var nameList = new Array(MAX_NUM+1); nameList[1] = "鈴木一郎"; nameList[2] = "田中太郎"; nameList[3] = "木村花子"; とまぁ、これを150人分(^_^; "var nameList = new ArrayList(MAX_NUM+1);" の行は1つでいいですが、"nameList[1] = "鈴木一郎";" の行を人数分用意する必要があるわけです。 [] カッコ内の番号は、1から順になります。 もしすでに名簿がテキストファイルで存在しているなら、秀丸なんかのエディタで一気に置き換えすれば楽です。 2.次に "document.all.number2.innerHTML = tmp;" の行を次の通り改造します。 document.all.number2.innerHTML = nameList[num] + "<br>" + tmp; これで名前が出るようになるはずです。 ちなみに、過去の履歴に名前を出すこともできますが、それをやろうとすると本格的な画面デザインが必要になります。(物理スペースの関係です)
お礼
ほんとにすごいです!!こんな短時間にできてしまうなんてすごいです! ちなみに…ほんと申し訳ないのですが… (1)今回当選者名前の前に"今回当選者:"、一番下番号の前に"過去当選者" などのドキュメントをいれるやり方 (2)一番下番号に同時に名前を残していく方法、を教えてください。 ほんと何から何までして頂いて申し訳ありません。 よろしくお願いいたします。本当にすみません。
はいはい。 難しい改造は無理ですが、数字のリストを表示するだけなら30秒でできますので(笑) こんなんでどうでしょう。 <html><head><title>乱数発生器</title></head> <body> <script language="javaScript"> <!-- var MAX_NUM = 150; var alreadyGet = new Array(); function getNumber() { if ( alreadyGet.length >= MAX_NUM ) { document.all.number1.innerHTML = "FIN!"; return -1; } while ( true ) { num = Math.floor( Math.random() * ( MAX_NUM ) ) + 1; for ( i = 0; i < alreadyGet.length; i++ ) { if ( alreadyGet[i] == num ) break; } if ( i == alreadyGet.length ) break; } alreadyGet.push(num); document.all.number1.innerHTML = "" + num; tmp = ''; for ( i = 0; i < alreadyGet.length; i++ ) { tmp += alreadyGet[i] + ","; } document.all.number2.innerHTML = tmp; } //--> </script> 1~150の乱数を発生させます。<br> <input id="button1" type="button" value="発生させる。" onclick="getNumber()"><br> <span style="font-size: 200pt"><span id="number1"></span></span><br> <span id="number2"></span> </body></html>
お礼
すぐにやっていただいてほんとにありがとうございます。 採用されそうです! で、また注文されてしまったのですが。 1,2,3,と乱数が出る横など見やすいところに、 1=鈴木一郎,2=田中太郎,3=木村花子など、別ファイルを 参照するなどして、番号=名前など登録しておき、名前が出るように はなりますか?ここまでやっていただいた上に、注文してしまい、 本当に心苦しいのですが、お力をかしてください。 よろしくお願いいたします。
でけますた。 1から150までのランダムな数字を、ボタンが押されるごとに出力し、一通り表示し終わると「FIN!」と出ます。 最初からやり直すときはブラウザ立ち上げなおしで。 <html><head><title>乱数発生器</title></head> <body> <script language="javaScript"> <!-- var MAX_NUM = 150; var alreadyGet = new Array(); function getNumber() { if ( alreadyGet.length >= MAX_NUM ) { document.all.number1.innerHTML = "FIN!"; return -1; } while ( true ) { num = Math.floor( Math.random() * ( MAX_NUM ) ) + 1; for ( i = 0; i < alreadyGet.length; i++ ) { if ( alreadyGet[i] == num ) break; } if ( i == alreadyGet.length ) break; } alreadyGet.push(num); document.all.number1.innerHTML = "" + num; } //--> </script> 1~150の乱数を発生させます。<br> <input id="button1" type="button" value="発生させる。" onclick="getNumber()"><br> <span style="font-size: 200pt"><span id="number1"></span></span> </body></html>
お礼
本当にすばらしいものを作っていただいてありがとうございます。 しかも文字まで大きくしていただけたなんて。。感動です。 これでスクリーンに出しても見やすいと思います。本当にありがとうございます。 欲を言ってほんとうに申し訳ないのですが、ランダムに出た数字は、 下のあたりに表か何かで記録させておくことはできるのでしょうか? 出来ないなら出来ないでよいのですが、たぶん今「何番だった?」などの 声が聞こえてくるような気がして… ほんとうにこんなすごいもの作っていただいた上に注文してしまいすみません。無理でなかったらお願いしたいのですが… すみません。よろしくお願いいたします。すみません。
質問文中のそのプログラムは JavaScript です。 JavaScript カテゴリは別にありますので、次からはそちらに書いた方がいいでしょう。 んで、ゲームのためにやむをえず突貫で勉強しているのですか? それとも今後プログラムの勉強を続けていくためですか? もし前者なら答えをずばりお教えできますので補足を下さい。 さしあたってやり方だけ説明します。 ランダムな数字の重複を防ぐには、配列を確保して、出力された結果が過去の結果と重複するか、チェックするロジックが必要です。 よって、 1.配列を確保 2.ランダムな数字を出力 3.配列の中の全ての要素と順に比較 3.1.出力された数字と合致する要素がある場合、2.へ戻る 4.ない場合、数字を配列に格納し、画面へ出力 このようなプログラムを書くことになります。 MAX値はスクリプトの先頭にでも書いておいて、いつでも書き換えできるようにしておけばいいでしょう。
補足
お返事ありがとうございます。 ゲームのためにやむをえず突貫で勉強しています。 会社の慰安会でくじをやることになり、そのフリーソフトを探していました が桁数が99までしかなく、約150名くらいのくじをやるには、 簡単なものを作るしかありませんでした。 図書館に行って、JAVAとC言語の基礎の本を先週日曜日に借りてきて、 とりあえずJAVAからはじめようとしていましたが、とても今週中には 間に合いそうにありません。。そこでお力をお借りしようと思いました。 答えをずばり教えていただけたら幸いです。 本当に申し訳ありませんがよろしくお願いいたします。
お礼
本当にここまでやって頂いてありがとうございます。 また注文されてしまって…本当にどうしたらよいか… というのも、(1)当選した番号だけを画面の中央に配置できないのか? (2)前回の当選者の番号の前に、5位 カメラ、4位 時計など、書けないのか? できれば、"現在:" + alreadyGet.length + "/" + MAX_NUM + "人";がでる番号に、 5位 カメラ、4位 時計など、nameListと同じように名簿を作った時と同じようにしたいです。 見せる度に言われてしまい、その都度お聞きして ここまでお手数かけてしまうのは、申し訳ないです。 お力をおかりしたいのはやまやまですが、もう本当にお手数のようなら言ってください。 よろしくお願いいたします。