- ベストアンサー
重複のない乱数の表示をするには?
- プログラミング初心者ですが、個人的に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]; }
- みんなの回答 (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の定義(または代入)が無いためです
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
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だと思いますよ
お礼
ここまでお付き合い頂き、本当に有難う御座います。 スペルミスのご指摘をありがとうございます。 何度も何度もお答え頂いているにも関わらず、どうしてもエラー発生や動作しなくなるといった現象が起こるので今回の私の記述を最後に、ご覧頂いてミスを指摘して頂きたいと存じます。 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)
最終的にはご提示のコードのrandamparの部分をnar[n]に置き換えるということになります 初期化処理時にmakeArrayを呼び出してnarを作成します putselect()関数に何番目の問題なのかのパラメータ付け加えます function putselect( n ) { select = mondaia[ nar[n] ]; japan = mondaib[ nar[n] ]; } といった具合に呼び出せばいいでしょう
お礼
ご親切にどうもありがとうございます。 ご説明して頂いた通りに入れたつもりなのですが、どうしてもエラーが発生して問題が出題されません。これはどこに問題があるのでしょうか?申し訳ありませんがまた回答お願いいたします。 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)
順序用の配列と乱数用の配列を用意して 順序用の配列を乱数用の配列を元にソートしてみればいいのではないかと思います 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] に重複しない乱数が生成可能ですよ
お礼
お早い回答をありがとう御座います。 大変申し訳ないのですが、記述して下さったプログラムは質問に書いてあるプログラムのどの部分に入れれば良いのですか?大変恐縮ですが、続けてお答え願えますでしょうか。 本当に初心者で申し訳ありません。
お礼
javascriptでタイピングソフトを作る講座を見ながら行なったので、自分でもまだ理解できてない部分が多々ありまして。質問されたことにお答えできない私が本当に情けないです。 もう少し勉強をしてからredfox63さんの回答をもう一度見直そうと思います。ご親切にここまでお付き合い頂いて感謝しております。 そのお気持ちに応える事ができず悔しい限りです。 本当に申し訳ありません。 ありがとうございましたm(_ _)m