Math.floor(Math.random() * (n + 1))
使い方が変では?
js
1const results = {};
2for (let i = 0; i < 100; i++) {
3 // 6面ダイスを振った想定でn = 6とする
4 let result = Math.floor(Math.random() * (6 + 1));
5 if (!results[result]) results[result] = 0;
6 results[result]++;
7}
8console.log(results);
9// {0: 17, 1: 14, 2: 15, 3: 19, 4: 10, 5: 10, 6: 15}
という訳で、6面ダイス想定で振ったのに
0と6が含まれる7つの結果が現れるという結果になってしまいました。
というわけで、これが正解なのでは?
Math.floor(Math.random() * n + 1)
そもそもMath.floor(Math.random() * n + 1)
ってなんやねん
欲しい答えはこっちだと思うので解説。
まずMath.random()を使ってサイコロをどうやって実現するか語らねばなりません。
Math.random()
を実行した場合、適当に0以上・1未満のNumberが返ってきます。
ここでは仮に0.54869400415161
という結果が得られたとしましょう。
基本的に乱数を伴うものはゲームなので以下の2パターンで考えてみましょう。
命中率70%の場合、結果0.54869400415161
に100倍して54.86...
を取り出します。
これが70以下ならば命中、70を上回れば回避です。
サイコロの場合は結果0.54869400415161
を6倍します。
これにより0以上、6未満のランダムな値が得られます。
しかし0.54869400415161 * 6
の結果は3.29...
と小数点を返すサイコロがどこの世界にあるねん!という問題が残ります。
なのでMath.floor()で小数点部分を消し飛ばします。
これにより、小数部分が消し飛び、「0, 1, 2, 3, 4, 5」のどれかの数値が返ってくるようになります。
でもサイコロの最小の値は0ではなく1ですよね?
なので結果全てに+1を行って「1, 2, 3, 4, 5, 6」にしてあげる必要があります。
js
1const results = {};
2for (let i = 0; i < 100; i++) {
3 // 6面ダイスを振った想定でn = 6とする
4 let result = Math.floor(Math.random() * 6 + 1);
5 if (!results[result]) results[result] = 0;
6 results[result]++;
7}
8console.log(results);
9// {1: 19, 2: 16, 3: 19, 4: 13, 5: 16, 6: 17}