質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

3回答

1640閲覧

Math.floor( Math.random() * (max - min + 1) ) + min;でらんすう乱数を取得できるのはなぜ?

abinai

総合スコア11

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

4クリップ

投稿2017/09/11 14:32

編集2017/09/12 07:01

なぜmaxminの範囲の乱数を取得できるのかしりたかったので、幾つかのサイトをめぐってみましたが、[Math.floor( Math.random() * (max - min + 1) ) + min;]がなぜmaxminの範囲の乱数を取得できるのかを書いてありませんでしたので教えてもらいたいと思い質問しました。拙い質問ですがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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()にこの結果を渡したとき、01の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 ~ 55 ~ 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

s8_chu

総合スコア14731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Math.random()は、0以上1未満の値をとる。
Math.floor()は引数として与えた数以下の最大の整数をとる。

以上が理解できれば、掲出の数式が取りうる範囲は自明かと思いますが。得心できないなら、数直線などを描いて考えてみては?

投稿2017/09/11 14:41

編集2017/09/11 15:01
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abinai

2017/09/11 23:15

確かにそうなんですが、。うーん、そうなんですが....
KojiDoi

2017/09/12 03:49

こういうときは境界値を考えてみるといいです。 random()が0の時、式の値は何になりますか? random()が1の時、式の値は何になりますか? これでも「そうなんですが……」だと、ちょっとどなたにもアドバイスは難しいのでは。
Lhankor_Mhy

2017/09/12 03:58

Math.floor( Math.random() * (max - min + 1) ) + min; Math.floor( [0, 1) * (max - min + 1) ) + min; Math.floor( [0, max - min + 1) ) + min; [0, 1, ..., max - min] + min; [0 + min, 1 + min, ..., max - min + min]; [0 + min, 1 + min, ..., max]; みたいに数式っぽく変化させるとわかり易いですかね? それとも、一様であるかどうかについて気にしてらっしゃる?
guest

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

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問