• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:重複のない乱数の表示をするには?)

重複のない乱数の表示をするには?

このQ&Aのポイント
  • プログラミング初心者ですが、個人的にJavascriptでタイピングソフトを作っています。
  • どうしても問題の出題を重複しないようにするプログラムがわかりません。どなたか御教授お願い致します。
  • 参考に現在の出題方法を記載しておきます↓ mondai=new Array(); mondaij=new Array(); mondailist=new Array(); mondailist="しゅんかしゅうとう,じゃくにくきょうしょく ,ごんごどうだん,あびきょうかん,"; kanjilist="春夏秋冬,弱肉強食,言語道断,阿鼻叫喚"; } function typetest(){ empty(); mondaia=mondailist.split(","); mondaib=kanjilist.split(","); function putsellect(){ //問題選出関数 randompar=Math.floor(Math.random() *mondai.length); sellect=mondaia[randompar]; japan=mondaib[randompar]; }

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

どこまで意図通りに動作しているのかを確認しましょう 問題と回答を splitで分割していますがこの分割後の保存している変数はどこで宣言しているのでしょう また typetestで分割した変数と putSelectで出力用に使っている変数と食い違っているように思います typetestでは mondaiとmondaijに格納しています putSelectではmondaiaとmondaibで参照しています どちらかに統一する必要があります またこの変数はどこで定義したのでしょう 使用する変数は varで宣言して使ったほうがいいように思います # 変数宣言しなくても使えてしまうので変数名のタイプミスなどを # 発見しにくいですけど 関数内で定義したローカル変数は 別の関数無いでは参照出来ません var Test1 = "A"; function foo() {   var Test2, Test3;   Test2 = "B";   Test3 = bar(); } function bar() {    return Test1 + Test2; } とあった場合 Test1はグローバル変数になり fooかbarの関数の中からもアクセス出来ます しかし Test2,Test3は 関数fooのローカル変数になりますので 関数fooの中でのみ使用可能な変数です Test3 = bar();設定される内容は"AB"ではなく"A"となります なぜなら 関数barのなかまたはグローバル変数にTest2の定義(または代入)が無いためです

noname#48221
質問者

お礼

javascriptでタイピングソフトを作る講座を見ながら行なったので、自分でもまだ理解できてない部分が多々ありまして。質問されたことにお答えできない私が本当に情けないです。 もう少し勉強をしてからredfox63さんの回答をもう一度見直そうと思います。ご親切にここまでお付き合い頂いて感謝しております。 そのお気持ちに応える事ができず悔しい限りです。 本当に申し訳ありません。 ありがとうございましたm(_ _)m

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

makeArrayはtypetest関数の外で定義します var ar, nar; function makeArray(mondai){   // 先の投稿の内容 } function typetest() {   mondai=mondailist.split(",");   mondaij=kanjilist.split(",");   makeArray( mondai );   for( n = 0; n < mondai.length; n++ ) {     putSelect( n );   } } といった具合に使います # セレクトのつづりは SellctではなくSelectだと思いますよ

noname#48221
質問者

お礼

ここまでお付き合い頂き、本当に有難う御座います。 スペルミスのご指摘をありがとうございます。 何度も何度もお答え頂いているにも関わらず、どうしてもエラー発生や動作しなくなるといった現象が起こるので今回の私の記述を最後に、ご覧頂いてミスを指摘して頂きたいと存じます。 var ar, nar; function makeArray(mondai){   var n, m, t;   ar = new Arrray();   nar = new Array();   // 乱数と順序用の配列を初期化   for ( n = 0; n < mondai.length; n++ ) {     ar[n] = math.random();     nar[n] = n;   }   // ここでソートを行う   for( n = 0; n < mondai.length -1; n++ ) {     for ( m = n + 1; m < mondai.length; m++ ) {       if ( ar[n] > ar[m] ) {         t = ar[n]; ar[n] = ar[m]; ar[m] = t;         t = nar[n]; nar[n] = nar[m]; nar[m] = t;       }     }   } } } function typetest(){  mondai=mondailist.split(","); mondaij=kanjilist.split(",");    makeArray( mondai );   for( n = 0; n < mondai.length; n++ ) {     putSelect( n ); } } function putselect( n ) {   select = mondaia[ nar[n] ];   japan = mondaib[ nar[n] ]; } 本当に申し訳ありません。 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

最終的にはご提示のコードのrandamparの部分をnar[n]に置き換えるということになります 初期化処理時にmakeArrayを呼び出してnarを作成します putselect()関数に何番目の問題なのかのパラメータ付け加えます function putselect( n ) {   select = mondaia[ nar[n] ];   japan = mondaib[ nar[n] ]; } といった具合に呼び出せばいいでしょう

noname#48221
質問者

お礼

ご親切にどうもありがとうございます。 ご説明して頂いた通りに入れたつもりなのですが、どうしてもエラーが発生して問題が出題されません。これはどこに問題があるのでしょうか?申し訳ありませんがまた回答お願いいたします。 mondai=new Array(); mondaij=new Array(); mondailist=new Array(); mondailist="しゅんかしゅうとう,じゃくにくきょうしょく ,ごんごどうだん,あびきょうかん"; kanjilist="春夏秋冬,弱肉強食,言語道断,阿鼻叫喚 } function typetest(){ empty(); mondai=mondailist.split(","); mondaij=kanjilist.split(","); var ar, nar; function makeArray(modai) {   var n, m, t;   ar = new Arrray();   nar = new Array();   // 乱数と順序用の配列を初期化   for ( n = 0; n < mondai.length; n++ ) {     ar[n] = math.random();     nar[n] = n;   }   // ここでソートを行う   for( n = 0; n < mondai.length -1; n++ ) {     for ( m = n + 1; m < mondai.length; m++ ) {       if ( ar[n] > ar[m] ) {         t = ar[n]; ar[n] = ar[m]; ar[m] = t;         t = nar[n]; nar[n] = nar[m]; nar[m] = t;       }     }   } } function putsellect(n){ //問題選出関数 sellect=mondai[ nar[n] ]; japan=mondaij[ nar[n] ]; }

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

順序用の配列と乱数用の配列を用意して 順序用の配列を乱数用の配列を元にソートしてみればいいのではないかと思います var ar, nar; function makeArray(modai) {   var n, m, t;   ar = new Arrray();   nar = new Array();   // 乱数と順序用の配列を初期化   for ( n = 0; n < mondai.length; n++ ) {     ar[n] = math.random();     nar[n] = n;   }   // ここでソートを行う   for( n = 0; n < mondai.length -1; n++ ) {     for ( m = n + 1; m < mondai.length; m++ ) {       if ( ar[n] > ar[m] ) {         t = ar[n]; ar[n] = ar[m]; ar[m] = t;         t = nar[n]; nar[n] = nar[m]; nar[m] = t;       }     }   } } nar[n] に重複しない乱数が生成可能ですよ

noname#48221
質問者

お礼

お早い回答をありがとう御座います。 大変申し訳ないのですが、記述して下さったプログラムは質問に書いてあるプログラムのどの部分に入れれば良いのですか?大変恐縮ですが、続けてお答え願えますでしょうか。 本当に初心者で申し訳ありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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> どなたかアドバイスをいただけないでしょうか? よろしくお願いします。

  • 重複しない乱数を作り配列に入れる(AS3.0)

    Flash Pro CS5 AS3.0 で記述しています。 1~10の整数をランダムかつ重複せずに配列に格納したいと考えています。 そこで,ネット上で参考になるソースを見つけ, 以下のように書き直しました。 var int_a = new Array(); var int_b = new Array(); function RandomInt():void{ //ここだけ変更すればよい var maxN:Number = 10;//乱数の最大値 //0~maxNの数字を全部配列に入れる for (var i:int=0; i< maxN; i++) { int_a[i] = i+1; } var j:Number = 0; var a_length:Number = int_a.length; //要は配列をシャッフルする while (a_length) { var int_r:Number = Math.floor(Math.random()*(maxN+1-j)); //乱発生した整数を配列int_bに順番に入れ、int_aから削除する int_b[j] = int_a.splice(int_r, 1); j++; //配列int_a内の数字が一つずつ減っていく a_length = int_a.length; } //ここで配列int_bがシャッフルされた trace(int_b); } RandomInt(); としました。 しかし出力結果がなぜか 8,2,4,9,,7,6,5,10,3,1のように抜けている部分があり, 次のフレームで for(var j:int=1; j <= 10; j++){   trace(int_b[j]); } として確認してもやはり 2 4 9 7 6 5 10 3 1 となってしまします。 どの部分がおかしいのか教えていただきたいです。 また,乱数発生の部分で Math.floor(Math.random()*(maxN+1-j)); という風に記述してあったのですが,ここは間違いではないのでしょうか? jを引いていくと発生する乱数の範囲が徐々に狭くなっていってしまうと思ったのですが; それとも元のソースコードを使って ttp://www.renowan.com/blog/?p=143 0~9までの乱数を発生させてそれぞれに1を足す方が簡単でしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • 特定の時間に複数のメッセージからアットランダムに表示する

    1 特定の時間(たとえば、朝の7時から8時まで)に2 複数のメッセージ(たとえば、どこかのページへのリンク)の中からランダムに表示するジャバスクリプトを作りたいと思っています。 1と2は別個のスクリプトがあるのですが、これを統合すればいいのでは、と思ってやっているのですが、わかりません。なにとぞ宜しくお願いいたします。 ================= 1 mes=new Array(24); mes[0]=""; mes[1]=""; //略 mes[23]=""; function timer(){ myDate=new Date(); myTime=myDate.getHours(); document.write(mes[myTime]); } timer(); //--> 2 var quotes=new Array() quotes[0]='メッセージかリンク' var whichquote=Math.floor(Math.random()*(quotes.length)) document.write(quotes[whichquote])

  • 乱数を配列へ格納(JavaScript)

    乱数を重複しないよう8個配列へ格納したいのですが、 格納の時点でエラーが発生します。 「オブジェクトでサポートされていないメソッドまたはプロパティです」 なぜでしょう? どなたかご教授下さい。 numbers = new Array(); // 空の配列宣言。 function make() { while(numbers.length < 8){ check = true; number = Math.floor(Math.random() * 100);// ランダムに0~99までの整数を取得。 for(i = 0; i < numbers.length; i++) { // 今取得したものと同じ乱数がないか、 if(number == numbers[i]) { // 配列の中身全てと比較。 check = false; } } if(check) { numbers.push(number); // 取得した乱数を配列に格納。 } } }

  • ランダムURL表示&被らないようにしたいです!

    window.onload = function(){ var nice_a = 3; var nice_b = 3; var nice_c = 3; var nice_d = 3; var ifm_3 = document.getElementById('nice_1');//1つめ var ifm_4 = document.getElementById('nice_2');//2つめ var ifm_5 = document.getElementById('nice_3');//3つめ var ifm_6 = document.getElementById('nice_4');//4つめ var urls_random_1 = Math.floor( Math.random() * nice_a ); var urls_random_2 = Math.floor( Math.random() * nice_b ); var urls_random_3 = Math.floor( Math.random() * nice_c ); var urls_random_4 = Math.floor( Math.random() * nice_d ); var urls_nice_1 = new Array(); var urls_nice_2 = new Array(); var urls_nice_3 = new Array(); var urls_nice_4 = new Array(); /*1*/ urls_nice_1[0] = 'niceStore/niceStore_1.html'; urls_nice_1[1] = 'niceStore/niceStore_2.html'; urls_nice_1[2] = 'niceStore/niceStore_3.html'; /*2*/ urls_nice_2[0] = 'niceStore/niceStore_1.html'; urls_nice_2[1] = 'niceStore/niceStore_2.html'; urls_nice_2[2] = 'niceStore/niceStore_3.html'; /*3*/ urls_nice_3[0] = 'niceStore/niceStore_1.html'; urls_nice_3[1] = 'niceStore/niceStore_2.html'; urls_nice_3[2] = 'niceStore/niceStore_3.html'; /*4*/ urls_nice_4[0] = 'niceStore/niceStore_1.html'; urls_nice_4[1] = 'niceStore/niceStore_2.html'; urls_nice_4[2] = 'niceStore/niceStore_3.html'; ifm_3.src = urls_nice_1[s];//1 ifm_4.src = urls_nice_2[s];//2 ifm_5.src = urls_nice_3[s];//3 ifm_6.src = urls_nice_4[s];//4 } </script> 求める結果:ページをロードする度、それぞれのiframe内のURLがランダムで選定され 尚かつURLが被らないようにしたいです。 上記の内容で記述しますと、あたりまえですが表示されるURLが被ってしまいます。 これを回避したいのですがどうがご教授願いします。m(_ _)m

  • 画像をランダムな座標に一定の時間で表示する方法

    javascript勉強中の65歳の初心者です 画像を乱数で得た座標に一定の時間で表示したいと次の通り試行錯誤していますが、どうも最初の1個は表示されますが配列の2番目以降表示されません。 初歩的な質問で恐縮ですがご指導お願いします。 <html> <head> <title>テスト表示</title> </head> <body onload= "set()"> <script language="JavaScript"><!-- sx = new Array(); sy = new Array(); num = 20; var timer; var n; var i; var m; n = 0; function set(){ for (m=0; m<num; m++) { sx[m] = Math.floor(Math.random()*800); sy[m] = Math.floor(Math.random()*600); } setInterval("uncohyouji()", 2000); } function uncohyouji(){ styl = "<img src='unco1.gif'style='position:absolute;"; document.write(styl+sx[n]+"px;left:"+sy[n]+"px;' name='unco1"+n+"'>"); n++; }

  • ランダムJavascriptのblank表示

    リンク先のURLをランダムで表示させるため、下記の様に読み込みjavascriptファイルを使用していますが、ターゲットをブランク表示にできません。 windowopenなどと併用する必要があるのか、あまりjavascriptに詳しくないため、 記載箇所を具体的に教えて頂けると嬉しいです。 ■JSファイル側 urls=new Array(); //ランダムで表示したいURLを指定する urls[0]='http://www.・・・'; urls[1]='http://www.・・・; urls[2]='http://www.・・・'; function random() { a=Math.floor(Math.random()*urls.length); location.href=urls[a]; } ■HTMLページ側 <a href="JavaScript:random();">リンクテキスト</a>

  • このjavascriptコードを短くできませんか?

    javascript初心者です。 どなたか下記のコードを短くしていただけないでしょうか? 変数1~変数12まであるので、それぞれコードを書いたら長くなってしまいました。 このままでもうまく動いてはいるのですが、もし短くできるならしたいなと思いまして。 よろしくお願いいたします。 <script type="text/javascript"> <!-- //基準になる日を設定 inputDay1 = "変数1"; //指定日を変数に var hairetu = inputDay1.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday1 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay2 = "変数2"; //指定日を変数に var hairetu = inputDay2.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday2 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay3 = "変数3"; //指定日を変数に var hairetu = inputDay3.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday3 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay4 = "変数4"; //指定日を変数に var hairetu = inputDay4.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday4 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay5 = "変数5"; //指定日を変数に var hairetu = inputDay5.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday5 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay6 = "変数6"; //指定日を変数に var hairetu = inputDay6.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday6 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay7 = "変数7"; //指定日を変数に var hairetu = inputDay7.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday7 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay8 = "変数8"; //指定日を変数に var hairetu = inputDay8.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday8 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay9 = "変数9"; //指定日を変数に var hairetu = inputDay9.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday9 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay10 = "変数10"; //指定日を変数に var hairetu = inputDay10.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday10 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay11 = "変数11"; //指定日を変数に var hairetu = inputDay11.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday11 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay12 = "変数12"; //指定日を変数に var hairetu = inputDay12.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday12 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); if (countday1 < 0)document.write("111"); if (countday2 < 0)document.write("222"); if (countday3 < 0)document.write("333"); if (countday4 < 0)document.write("444"); if (countday5 < 0)document.write("555"); if (countday6 < 0)document.write("666"); if (countday7 < 0)document.write("777"); if (countday8 < 0)document.write("888"); if (countday9 < 0)document.write("999"); if (countday10 < 0)document.write("101010"); if (countday11 < 0)document.write("111111"); if (countday12 < 0)document.write("121212"); --> </script>

  • ボタンを押すまで次の処理へ行かないようにする方法

    問題を出題して、答えボタンを押すと、答えが表示され、nextボタンが押されると 次の問題を表示するというプログラムを考えているのですが <BODY> <FORM> <SCRIPT type="text/javascript"> <!-- mondai = new Array(); mondai[0] = "問題1"; mondai[1] = "問題2"; answer = new Array(); answer[0] = "答え1"; answer[1] = "答え2"; for(i = 0; i < 2; i++) { document.write(mondai[i] + "<P>"); document.write("<INPUT type=\"button\" value=\"答え\">"); while(true){ if(document.forms[0].elements[0].value == true){ break; } } document.write(kotae[i] + "<P>"); document.write("<INPUT type=\"button\" value=\"次へ\">"); } // --> </SCRIPT> </FORM> </BODY> onclickではなく、ボタンが押されたとわかるには、どのように記述すればいいのでしょうか。 ググッても、欲しい情報が出てこず、困っています。 while(true){ if(document.forms[0].elements[0].value == true){ break; } } このように書いて、valueがtrueなら、押されたってことかな。と自分の想像でコードを書いてみた のですが、うまくいきません。 whileでループさせて、ifボタンが押されたら、breakでwhileを抜け出すように書いたのですが ボタンが押されたを、検知するにはどのように書いたらいいでしょうか。 なお、なにぶん作成途中なので、コードは未完成です。ボタンが押されたというのを、どの ようにコード書いたらいいのかアドバイスいただけるとうれしいです。

  • 外部のテキストを読み込んで数値として使う。

    下記のような内容のテキストファイルがあり 各行を各フレーム目のクリップのx座標y座標 に当てはめたいのです。 一フレーム目は(x,y)=10,10 5フレーム目は(x,y)=50,50 といった具合に テキスト(ppp.txt)の内容 10,10 20,20 30,30 40,40 50,50 60,60 70,70 80,80 90,90 メインのタイムラインに var load_lv:LoadVars = new LoadVars(); load_lv.load("ppp.txt"); load_lv.onData = function(s) { if (s.length > 0) { myFunction(s); } } function myFunction(s:String):Void { var lines:Array = s.split("\n"); for(i=1;i<9;i++){ var Array_1:Array = lines[i].split(","); clip_1._x = 5*Number(Array_1[0]); clip_1._y = 5*Number(Array_1[1]); } } これでは無理でした、、、 お願いします

    • ベストアンサー
    • Flash