アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは、今おみくじスクリプトを作成しているのですが、うまくいかない点があります。

大吉や吉といったランクごとに、健康運や恋愛運といった6つの部分が◎○△×のどれかにランダムでなるというスクリプトをつくりました、うまく実行はされるのですが、処理が重く、IEで「実行をとめますか?」とエラーが出ています。
何か、おかしな点があれば、教えていただけませんか?



for(cnt=0;cnt<w.ura;cnt++)
{
j = Math.floor(Math.random()*i);

if(utc[j]==0) utc[j] = "◎";
else{
cnt -=1;
}
}

for(cnt=0;cnt<w.urb;cnt++)
{
j = Math.floor(Math.random()*i);

if(utc[j]==0) utc[j] = "○";
else{
cnt -=1;
}
}

for(cnt=0;cnt<w.urc;cnt++)
{
j = Math.floor(Math.random()*i);

if(utc[j]==0) utc[j] = "△";
else{
cnt -=1;
}
}

for(cnt=0;cnt<w.urd;cnt++)
{
j = Math.floor(Math.random()*i);

if(utc[j]==0) utc[j] = "×";
else{
cnt -=1;
}
}

w.ura等は、ランクごとの◎などの数が格納されたストラクトです。

やっていることは、◎の数まわして、空の配列であれば、◎をいれるといったことです。

よろしくご教授ください。

A 回答 (2件)

> たしかに、おっしゃられている通り、場合によっては、永久ループですね・・・考えてませんでした。


> やはり、そこが問題でエラーがでているのでしょうか?

そうですね。やはり永久ループ(に近い状態)になっていることが、直接の原因でしょう。
そしてその原因は、「空の配列であれば◎をいれ、そうでなければやり直す」というやり方にあります。

初めのうちは、配列のほとんどが空なので、ほとんど「やり直す」ことなくループは進行します。
しかし、終わりのほうになってくると、配列のほとんどはもうすでに埋まっています。つまり、終わりのほうでは必然的に「やり直す」回数が増えてくるわけです。一番最後においては、「空」はたった1個しかありませんから、乱数の値がそれになるまでかなりの回数「やり直す」ことになります。
この無駄なやり直しが、スクリプトの動作を遅くしていると思われます。
    • good
    • 0
この回答へのお礼

何度も、回答ありがとうございます。

プログラムが長くなったのですが、「空じゃなかったら、『 if(utc[j]==0) 』 のJを++する
Jが5だったらFORを5回かまして、あいているところを順序探していく」というプログラムに変更してら、エラーは出なくなったので、「永久ループしそうなプログラム」がダメだったみたいですね。

全然気づきませんでした・・・・
本当に、ありがとうございます。

お礼日時:2004/03/27 09:42

ソートというよりこれはただのループですね。



ただ、現在のやり方はかなり非効率です。
それぞれのループの中で、
cnt -=1;
というようにしてループカウンタを戻していますよね。
これだと、乱数の出方によっては永遠にループしてしまいます。

スクリプトを見ると、
◎が w.ura 個
○が w.urb 個
△が w.urc 個
×が w.urd 個
というように決まっているようなので、
予め配列 utc に◎を w.ura 個、○を w.urb 個、△を w.urc 個、×を w.urd 個入れておいてから、ランダムにシャッフルするという方法がお勧めです。

(utcの長さ = i = w.ura + w.urb + w.urc + w.urd になっているんですよね?)

この回答への補足

本文にきちんと書けばよかったのですが、他の方法を探してはいないんです。
と、いうのも、いろいろな方法で試してはいるので、実際には、作成は完了しているのですが、この方法だけうまくいかなかったので、この方法での問題点がしりたかったのです。

たしかに、おっしゃられている通り、場合によっては、永久ループですね・・・考えてませんでした。
やはり、そこが問題でエラーがでているのでしょうか?
私自身、JSにはあまりなれておりませんので、書き方がおかしい個所でもあるのかな?って思ってたのです。

補足日時:2004/03/26 14:46
    • good
    • 0

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