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

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

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

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

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

Q&A

解決済

4回答

1796閲覧

Math.floor()の使い方に関して

asaminnnn

総合スコア4

JavaScript

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

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

0グッド

1クリップ

投稿2020/01/16 08:19

編集2020/01/16 08:24

Math.floor()の使い方に関して

現在Javascriptを勉強中なのですが、
以下のコードでなぜ「(n+1)」をするのかが理解できずに悩んでいます。

記事などを見ても、解答らしきものが見当たらず、
どなたか教えていただけると嬉しいです。

function rand(n) { return Math.floor(Math.random() * (n + 1)); }

試したこと

・MDNでの検索
・Qiitaでの検索
・teratailでの同件がないかの検索

どうぞよろしくお願いいたします。

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

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

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

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

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

hayataka2049

2020/01/16 08:22

(ある問題」とはどんな問題でしょうか。適切に引用するなどして内容を示してください。
x_x

2020/01/16 08:24

どこで出てきたのでしょうか? 「ある問題」を知らない第三者にはわからないでしょう。
asaminnnn

2020/01/16 08:24

失礼しました。余分な文言を削除しました。
hayataka2049

2020/01/16 08:25

コードだけ見ても回答しづらいと思います。文脈がわかるような情報がいると思うのですが、書けないような出典なのでしょうか。
x_x

2020/01/16 08:28

余計ではなく、不足しているのです。
退会済みユーザー

退会済みユーザー

2020/01/16 08:44

質問のタグになぜ teratail がついているのか。javascript 一つで十分でしょうに。
guest

回答4

0

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パターンで考えてみましょう。

  • 命中率(100分率)
  • サイコロ

命中率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}

投稿2020/01/16 08:43

編集2020/01/21 02:48
miyabi-sun

総合スコア21158

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

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

asaminnnn

2020/01/16 09:25

おお!!Math.random()、Math.floor()の違いが具体的にイメージできました!ここまでわかりやすくご回答いただき、ありがとうございます。 同じような方に出会ったら、自分も同じように具体的なイメージを持たせられるような説明に努めます。その前に、まずは勉強頑張ります。
guest

0

以下の点を留意して調べ直してください。

  • このrand関数で得たいものは何か。
  • Math.randomで得られるものは何か、またそれにn+1を掛けることで得られるものは何か。
  • Math.floor関数は何をするものなのか。

投稿2020/01/16 08:28

編集2020/01/16 08:32
swordone

総合スコア20651

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

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

swordone

2020/01/16 08:31

検索した、と言っていますが、何を知りたいのか不明確なまま調べても何の意味もありません。
asaminnnn

2020/01/16 09:26

おっしゃる通りです。 何を知りたいのかをまとめて質問するように気をつけます。 焦って書いてしまいました。反省しています。
guest

0

Math.randam() は 0以上1未満の乱数を生成します。
Math.random()*nn を含まないです。
Math.floor(Math.randmo()*(n+1)) にすることで 0〜n (nを含む)乱数整数を生成できます。

投稿2020/01/16 08:45

編集2020/01/16 08:58
shiracamus

総合スコア5406

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

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

asaminnnn

2020/01/16 09:17

「0〜n(nを含む)乱数整数を生成」ということを私も言いたかったです。伝わりスク回答いただき、ありがとうございました。
guest

0

自己解決

FB下さったみなさま、ありがとうございました。
自分の中で何が分かっているのか、分かっていないかを明確にできないまま
焦って調べてしまい、混乱したまま質問していました。

今後は、相手の立場に立って質問、解答できるように努めます。

今回の質問に関しては、自己解決しました。
・Math.random()関数は、0.0以上1.0未満までのランダムな浮動小数点を得ることができる。
・Math.floor()関数は、引数として与えた数以下の最大の整数を返すことができる。
・もし「3までの結果」が返ってきてほしい場合、

javascript

1function rand(n) { 2 return Math.floor(Math.random() * n ); 3} 4randomNumber(3);

と書いてしまうと最大「2」までしか結果が返ってこないので、

javascript

1function rand(n) { 2 return Math.floor(Math.random() * (n + 1) ); 3} 4randomNumber(3);

上記のように引数に+1しているということがわかりました。

投稿2020/01/16 08:59

asaminnnn

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問