• ベストアンサー

【数字ランダム】計算問題ランダム計画

1から10の乱数を使った 足し算、引き算を考えていまして、 ダイナミックテキスト(mondai)に 式と答えを表示。 同じ数字の組み合わせの問題が続けて出るので それを回避するために、 皆様のお知恵をお借りしたいと思いました。 自分が考えている回路図は、 //乱数[0-9] randam_a = Math.floor(Math.random()*10); randam_b = Math.floor(Math.random()*10); //足し算か引き算か計算ちぇっく check = Math.floor(Math.random()*2); ※このあたりに前回のrandam_a & randam_bの 値を調べて同じならば、前回と違う値が入るまで loop処理を加える。 //足し算ならば if (check == 0){   total = randam_a - randam_b ;   mondai = String(randam_a)+"+"+String(randam_b)+"="+String(total); //引き算ならば } else if (check == 1) {    total = randam_a + randam_b ;    mondai = String(randam_a)+"-"+String(randam_b)+"="+String(total); //引き算の処理ならば }else if (check == 1){ (略してます) } という流れを考えてます。 それ以外に、いけそうな処理の流れが あれば、そのチャートも知りたいので 解説して頂けると勉強になります>< 宜しくお願いします!

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

  • ベストアンサー
noname#35109
noname#35109
回答No.2

なんだか楽しそうな計画名ですね。 私の案も1つ。 私はあまり後を振り返りません(少しは反省しろ!)。 そして, 先に道がないと進みません(堅実派?)。 という性格が出ているのかどうかは知りませんが, 「過去にあったデータと重複しないように次のデータを出す。」 という考え方ではなくて, 「先に重複しないデータを用意しておく。」 という方法を考えました。 概要は,次の通りです。 次のものは実際のスクリプトコードではありません。 単なるイメージフローです。 ----------------------------------- // とりあえずデータ用1次元配列を作って dataArr= new Array(); // ↓こんな感じに値を入れて行き(本当はfor文) dataArr[0] = "1,1"; dataArr[1] = "1,2"; dataArr[2] = "1,3"; dataArr[3] = "1,4";  …     … dataArr[98] = "10,8"; dataArr[98] = "10,9"; dataArr[99] = "10,10"; // 100個の要素からランダムな要素取得し, // ,(カンマ)で区切って新しい配列 quesArr0 に代入 quesArr0 = new Array(); quesArr0 = dataArr[乱数].split(","); //そして 100個の要素から上のランダムな要素を抜きとる dataArr.splice(乱数); //--- // 99個の要素からランダムな要素取得し, // ,(カンマ)で区切って新しい配列 quesArr0 に代入 quesArr1 = new Array(); quesArr1 = dataArr[乱数].split(","); //そして 99個の要素から上のランダムな要素を抜きとる dataArr.splice(乱数); //  ↓ 1つずつ要素を減らしながら繰り返す ↓ // 1個の要素からランダムな要素取得し, // ,(カンマ)で区切って新しい配列 quesArr0 に代入 quesArr99 = new Array(); quesArr99 = dataArr[乱数].split(","); //そして 1個の要素から上のランダムな要素を抜きとる dataArr.splice(乱数); // dataArr は空になる。 --------------------------------------- という考え方で, 最終的に, quesArr0() ~ quesArr99() という100個の配列に, 重複しない要素を取得する方法です。 と書きましたものの,フローがやたらややこしいですね。 スクリプトの方が簡単かもしれません。 新規ドキュメントを作成して, ステージ上にインスタンス名 「my_btn」 という検証用の適当なボタンを用意して, フレーム1 に次のスクリプトをコピペしてください↓。 ----------------------------------------- // 上限の数を設定(1~10なので10) var lastNum = 10; // // ---元データの準備--- // 元データ配列 dataArr の作成 dataArr = new Array(); var i = 0; for (var j = 1; j<=lastNum; j++) { for (var k = 1; k<=lastNum; k++) { dataArr[i] = j+","+k; i++; } } /* // ちょっと中間検証 trace("dataArr[99]="+dataArr[99]); trace("dataArrの要素数="+dataArr.length); */ // // 配列 qesArr0~要素数 に dataArr の各要素を代入 var len = dataArr.length-1; for (i=0; i<=len; i++) { ransu = Math.floor(Math.random()*(len+1-i)); this["quesArr"+i] = new Array(); this["quesArr"+i] = dataArr[ransu].split(","); dataArr.splice(ransu, 1); } // ---以下検証用スクリプト--- // 変数 i の初期化 i = 0; // インスタンス名 my_btn の 動作を定義 _root.my_btn.onRelease = function() { // var a = _root["quesArr"+i][0]; var b = _root["quesArr"+i][1]; trace("quesArr"+i+"[0]="+a+" , quesArr"+i+"[1]="+b); i++; }; ----------------------------------------- コピペできましたら, 「制御」→「ムービープレビュー」で,動作させてみてください。 (「ファイル」→「パブリッシュ」ではありませんよ。) そして, インスタンス名 「my_btn」 という検証用のボタンをクリックしてみてください。 quesArr0~quesArr99 までの, 各 0 と 1 の要素が確認できると思います。 変数名の付いたテキストフィールドを用意しても検証できますが, 面倒くさいので,上のように 有効に trace() を使って検証してみてください。 trace() は便利な関数ですよ。 最初の, // 上限の数を設定(1~10なので10) var lastNum = 10; ここを,例えば var lastNum = 30; に変えると, 30×30=900のランダムな問題データが用意されます。 私の考えた回路は以上です。 ===================== この場をお借りしまして, 前回ご質問の回答の補足をさせていただきます。 今回のご質問で律儀に String() 関数を使われていますが, そんなに厳密に使われなくてもかまいませんよ。 ああいう厳密っぽいご質問があったので,私も律儀に答えただけです。  ↓   ↓ 「【Flash8】文字列の足し算?」 http://oshiete1.goo.ne.jp/qa2690349.html  ↑教えて!goo ↓OKWave (同じです) http://okwave.jp/qa2690349.html あと,訂正です。 > 「文字列」+「数値」は「文字列」ですから, > 最後の行は, > > hyouji = String(hensu_A)+"+"+hensu_B+"="+total_AB; > > でもかまいません。 と書きましたが, よく考えると,「数値」+「文字列」も「文字列」ですから, さらに, hyouji = hensu_A+"+"+hensu_B+"="+total_AB; でも良かったのです。 String() 関数はご質問の場合,全く不要でした。 お詫び致します。

dizzdive
質問者

お礼

ダイナミックなコードびっくりしました! ボタンを押すたびに配列の中が出力されて ワクワクします! ありがとうございます!参考になりました。

その他の回答 (1)

  • stiffels
  • ベストアンサー率34% (25/72)
回答No.1

var history = new Object(); // 連想配列 do{ randam_a = Math.floor(Math.random()*10); randam_b = Math.floor(Math.random()*10); } while(history[randam_a + ":" + randam_b]); history[randam_a + ":" + randam_b] = 1; // 組み合わせ履歴を保存 こんな感じですかねー。

dizzdive
質問者

お礼

なるほどー。 変数配列に組み合わせ履歴を調べて 同じ問題を回避するのか! こういう手法もあるのか 自分の視野せまいなー>< ひとつ大人になりました! ありがとうございます。