プロが教える店舗&オフィスのセキュリティ対策術

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){

(略してます)

}

という流れを考えてます。
それ以外に、いけそうな処理の流れが
あれば、そのチャートも知りたいので
解説して頂けると勉強になります><
宜しくお願いします!

A 回答 (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() 関数はご質問の場合,全く不要でした。
お詫び致します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/25 10:49

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; // 組み合わせ履歴を保存

こんな感じですかねー。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/24 14:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!