こんにちは、今おみくじスクリプトを作成しているのですが、うまくいかない点があります。
大吉や吉といったランクごとに、健康運や恋愛運といった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等は、ランクごとの◎などの数が格納されたストラクトです。
やっていることは、◎の数まわして、空の配列であれば、◎をいれるといったことです。
よろしくご教授ください。
No.2ベストアンサー
- 回答日時:
> たしかに、おっしゃられている通り、場合によっては、永久ループですね・・・考えてませんでした。
> やはり、そこが問題でエラーがでているのでしょうか?
そうですね。やはり永久ループ(に近い状態)になっていることが、直接の原因でしょう。
そしてその原因は、「空の配列であれば◎をいれ、そうでなければやり直す」というやり方にあります。
初めのうちは、配列のほとんどが空なので、ほとんど「やり直す」ことなくループは進行します。
しかし、終わりのほうになってくると、配列のほとんどはもうすでに埋まっています。つまり、終わりのほうでは必然的に「やり直す」回数が増えてくるわけです。一番最後においては、「空」はたった1個しかありませんから、乱数の値がそれになるまでかなりの回数「やり直す」ことになります。
この無駄なやり直しが、スクリプトの動作を遅くしていると思われます。
何度も、回答ありがとうございます。
プログラムが長くなったのですが、「空じゃなかったら、『 if(utc[j]==0) 』 のJを++する
Jが5だったらFORを5回かまして、あいているところを順序探していく」というプログラムに変更してら、エラーは出なくなったので、「永久ループしそうなプログラム」がダメだったみたいですね。
全然気づきませんでした・・・・
本当に、ありがとうございます。
No.1
- 回答日時:
ソートというよりこれはただのループですね。
ただ、現在のやり方はかなり非効率です。
それぞれのループの中で、
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にはあまりなれておりませんので、書き方がおかしい個所でもあるのかな?って思ってたのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:02
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Visual Basic(VBA) vbaで色付けされたセルを除外したいのですが 5 2023/01/28 17:22
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- Visual Basic(VBA) エクセルVBAコピー 2 2022/06/08 21:45
- Excel(エクセル) マクロ(データ取得と転記)について教えてください 3 2022/12/24 12:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
pythonでファイルのコメント行...
-
CSVファイルの特定の行だけを読...
-
DOSコマンドのループ内のTIMEコ...
-
「偶数・奇数の和」のフローチ...
-
vb.netからエクセル関数書き込み
-
VB2010でCSVファイルの読み込み
-
VBAで3秒だけ時間を止めたい
-
DoEventsが必要な理由について
-
For文を使った九九表の作成
-
Do whileでExitせず、ループの...
-
エクセル関数で1〜12の数字がル...
-
VBA for文が止まらない
-
Escキーを押すと、中断する時と...
-
テキストボックスの名前に変数...
-
null 参照の例外が実行時に発生...
-
UWSCの終了の仕方
-
VBA横データを縦にしたいです
-
VBA for i=1 to lastrow
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vb.netです。2次元配列の要素を...
おすすめ情報