- 締切済み
0だけは5回中1回表示し、他は条件なしのランダムで
0~20の数字があります。 1つの数字だけを表示させます。 0以外の全ての数字はランダムに表示します。 0は5回中1回表示させるようにしたいです。 fff(0); function fff(b){ if(b%5 == 0){ a=0; }else{ a = Math.floor(Math.random() * 20) + 1; } alert(a); b++; setTimeout('fff(' + b + ')', 2000); } では1~20までの数字がランダムに表示されますが、 0が表示されるタイミングが決まってしまいます。 もっと上手にするためにはどうしたらよいのでしょうか。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- babu_baboo
- ベストアンサー率51% (268/525)
1から20までの、はいれつをよういし、しゃっふるします。 5こかんかくで、そのなかにてきとうに0をそうにゅうします あとは、はいれつのあたまからとりだす。 はいれつがなくなったら、つくりなおす function random () { var ary = []; function range (a, b) { var ary =[]; var i; for (i = a; i <= b; i++) { ary.push (i); } return ary; } function randomInt (n) { return Math.floor (Math.random () * n); } function shuffle (ary) { var len = ary.length; var i, n, m; for (i = len; i; ) { n = randomInt (i--); m = ary[i]; ary[i] = ary[n]; ary[n] = m; } return ary; } function ikasama (ary) { var insertAry = [0,0,0,0]; var len = insertAry.length; var span = 5; var i; for (i = 0; i < len; i++) { ary.splice (i * span + randomInt (span), 1, insertAry[i]); } return ary; } function reset () { ary = ikasama (shuffle (range (1, 20))); alert(ary); } return function () { if (0 === ary.length) { reset (); } return ary.shift (); }; } var next = random (); setInterval (function () { alert (next ()); }, 1000); </script> -- いけてないけど <script type="application/javascript; version=1.8"> var random = (function ikasama () { function randomInt (n) Math.random () * n | 0 function range (a, b) { for (; a <= b;) yield a++ } function shuffle (ary) { let n; while (0 < (n = ary.length)) yield ary.splice (randomInt (n), 1) } function ikasama (a,b) this.ary.splice (this.span * b + randomInt (this.span), 1, a) var r; var ary = [x for each (x in range (1, 20)) ]; var buf = []; var insertAry = [0,0,0,0]; while (true) { if (buf.length < 1) { buf = [x for each (x in shuffle (ary)) ]; insertAry.forEach (ikasama, { ary: buf, span: 5 }); } yield buf.shift (); } }) (); setInterval (function () { alert (random.next ()); }, 1000); </script>
- honeborn
- ベストアンサー率100% (4/4)
こんな感じかな。 var a = Math.floor(Math.random()*5); for(var i=0; i<=4; i++){ if(i==a){ alert(0); continue; }; alert(Math.floor(Math.random()*20+1)); };
- fujillin
- ベストアンサー率61% (1594/2576)
>もっと上手にするためにはどうしたらよいのでしょうか。 上手にといっても、『5回中1回』という意味をどう捉えるかによって変わってくるかと思います。 ご提示の方法は必ず5回おきに0が表示されますので、『5回中1回』の典型といえます。 確率的に『5回中1回』でよいのなら、0~4の乱数(整数)を発生させて、0だったら0それ以外は1~20。これだと、0が出ないことが何回も続いたり、連続して0が出る可能性はありますが、十分大きな回数繰り返せば確率的に『5回中1回』。 5回ごとに0~4の乱数を発生し次に0を出す順番を設定するという方法も考えられます。これだと9回以上連続して0が出ないということがなくなります。もちろん『5回中1回』となります。 このような考えを複合したような方法も考えられるとは思いますが、基本的に質問者様の『5回中1回』ということの意味によると思います。
- joqr
- ベストアンサー率18% (742/4026)
ヒント 1-20の乱数と 0-4の乱数を作れば?