なぜmaxminの範囲の乱数を取得できるのかしりたかったので、幾つかのサイトをめぐってみましたが、[Math.floor( Math.random() * (max - min + 1) ) + min;]がなぜmaxminの範囲の乱数を取得できるのかを書いてありませんでしたので教えてもらいたいと思い質問しました。拙い質問ですがよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
Math.random()
は** 0 以上 1 未満の範囲内でランダムな浮動小数点を返します**。Math.floor()
は引数の数値以下の最大の整数を返します。
では、Math.floor()
にMath.random()
の結果を渡してみるとどうなるでしょうか。
javascript
1Math.floor(Math.random());// 0
Math.floor()
は、小数点以下を切り捨て、整数部分を返すので、常に0
を返します。
このままでは、1つの数値しか得ることができません。より多くの数値を得るためには、Math.floor()
に渡される数値を大きくする必要があります。そこで、Math.random()
を2倍したときに何が起こるかを見てみましょう。
javascript
1Math.floor(Math.random() * 2);// 0 2Math.floor(Math.random() * 2);// 0 3Math.floor(Math.random() * 2);// 0 4Math.floor(Math.random() * 2);// 1 5Math.floor(Math.random() * 2);// 0
先ほども書きましたが、Math.random()
は0 ~ 0.99999...
の範囲の数値を返します。そして、これを2倍しているので、得られる数値の範囲は0 ~ 1.9999...
となります。なので、Math.floor()
にこの結果を渡したとき、0
と1
の2つの値が得られるようになります。Math.random()
にかける数を3倍, 4倍, 5倍, ...と増やしていくごとに、得られる数値の数も3個, 4個, 5個...と増えていきます。
次に、5 ~ 10
の範囲でランダムな整数を生成したい場合を考えてみましょう。5 ~ 10
には、5, 6, 7, 8, 9, 10
というように6つの数値が存在することがわかります。つまり、Math.random()
に6をかける必要があると言うことです。ここで、なぜそんなことをするのかは置いておいて、5(最小値)と10(最大値)から6という数値を作ってみます。よく考えてみると、6という数値は(最大値) - (最小値) + 1
という式で作ることができるとわかります。
では、早速今導き出した式を使ってランダムな整数を出力してみましょう。
javascript
1Math.floor(Math.random() * (10 - 5 + 1));// 1 2Math.floor(Math.random() * (10 - 5 + 1));// 3 3Math.floor(Math.random() * (10 - 5 + 1));// 5 4Math.floor(Math.random() * (10 - 5 + 1));// 0 5Math.floor(Math.random() * (10 - 5 + 1));// 3 6Math.floor(Math.random() * (10 - 5 + 1));// 5 7Math.floor(Math.random() * (10 - 5 + 1));// 2
このままではまだ問題が残っていることに気づいたでしょうか?そうです、5 ~ 10
の範囲ではなく、0 ~ 5
の範囲のランダムな整数になってしまっています。どうすれば、0 ~ 5
を5 ~ 10
にすることができるでしょうか。
0, 1, 2, 3, 4, 5 5, 6, 7, 8, 9, 10
よく見てみると、1行目の数値それぞれに5
ずつ加えると、2行目の数値になることがわかります。また、この5
というのは今回作りたい乱数の中で最小の値です。
これらを踏まえた上で、正しく動作するようにコードを修正すると以下のようになります。
javascript
1Math.floor(Math.random() * (10 - 5 + 1)) + 5;// 9 2Math.floor(Math.random() * (10 - 5 + 1)) + 5;// 5 3Math.floor(Math.random() * (10 - 5 + 1)) + 5;// 6 4Math.floor(Math.random() * (10 - 5 + 1)) + 5;// 8 5Math.floor(Math.random() * (10 - 5 + 1)) + 5;// 10 6Math.floor(Math.random() * (10 - 5 + 1)) + 5;// 7
これで5 ~ 10
の範囲でランダムな整数を生成することができるようになりました。この一連の流れから、Math.random()
に(最大値) - (最小値) + 1
をかけて、それに最小値
を足すことで最小値 ~ 最大値
の範囲のランダムな整数を生成できるとわかりました。あとは、最小値、最大値
に対してmin, max
という変数を用意すれば質問文にあるMath.floor( Math.random() * (max - min + 1) ) + min;
が出来上がります。
javascript
1var min = 5, max = 10; 2Math.floor(Math.random() * (max - min + 1)) + min;
投稿2017/09/12 08:08
総合スコア14731
0
Math.random()は、0以上1未満の値をとる。
Math.floor()は引数として与えた数以下の最大の整数をとる。
以上が理解できれば、掲出の数式が取りうる範囲は自明かと思いますが。得心できないなら、数直線などを描いて考えてみては?
投稿2017/09/11 14:41
編集2017/09/11 15:01総合スコア13671
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/12 01:17
2017/09/12 03:49
2017/09/12 03:58
0
Math.floor( Math.random() * (max - min + 1) ) + min;
数字適当に当てはめてみてはどうですか?
例えばmax = 10 , min = 2
そうすると単純に
Math.floor( Math.random() * (9) ) + 2;
となり
ランダム値が最低の0でも 最後に2を足してるため最低でもmin以上の値になる。
ランダム値が最高(ではないけど)の0.9でも、9*0.9=8.1 これを切り捨てして 8 で最後に2を足して10でmax以下になる。
max - min + 1 でminを引いてるのは最後に+minをしてるから
ここで引かないと最大値が12になってしまう。
+1はランダム値が1未満だからそのままで掛けて切り捨てちゃうと
最大値にどうしても届かないので足しといて上げる。
自分も今回これを初めて見てよくわからなかったですけど、
何回か当てはめながらやったらわかったので試してみてはいかがでしょうか
投稿2017/09/12 04:54
編集2017/09/12 04:57退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。