(int)(Math.random() * 10)で0~9の乱数が得られます。
この意味が全く理解できません。
乱数をキーワードに検索を続けていくと下記のような投稿を見つけました。
さいころの目を題にしたものがあると思うのですが、
その場合、Math.random() * 6 + 1 と回答されていると思います。
それは、
0~5までの乱数を作成し、作成された乱数に1を加算していて、
乱数:Math.random() * (max - min + 1) + min
という計算式を元に考えられているのですよね?
ますます意味が分かりません。
どなたか私のような者でも分かるように噛み砕いて説明して頂けないでしょうか?
疑似乱数が何かとか、乱数の種類には何があってとか説明されても分からないと思います。
まずは上記の内容について説明頂きたいです。くだらない質問ですみませんが宜しくお願い申し上げます。
No.2ベストアンサー
- 回答日時:
Math.random()メソッドは、0.0以上1.0未満のdouble値を返します。
例えば、
int x = (int)Meth.random();
と書くと、xは必ず0になりますよね。random()メソッドの戻り値は、0から限りなく1に近い0.99999...の範囲のdouble値なので、int型にキャストすると小数点以下は切り捨てられ、0になってしまいます。
int x = (int)(Math.random() * 2);
と書くと、xは必ず0か1になります。random()メソッドから返ってくる0~0.9999...の値に2をかけると、0~限りなく2に近い1.999...の範囲の値が得られますよね。
ということは、それをintにキャストすると、小数点以下が切り捨てられて0か1になるというわけです。
では、これはどうでしょうか。
int x = (int)(Math.random() * 6);
0.0以上1.0未満の値に6をかけると、0~限りなく6に近い5.999...というdoule値が返されます。それをintにキャストすると、もうおわかりかと思いますが、0~5の値が得られます。
0~5の値が得られるということは、それに1を足せばサイコロの目を表現できますね。
(int)(Math.random() * 6 + 1);
//(int)((Math.random() * 6) + 1);
このように、0~5.999...の値に1を足せば、1~6.999...の値を得ることができます。それをint型にキャストすれば、1~6の値になるということです。
少し説明がくどくなりましたね。申し訳ないです。
yagumaさん、ご丁寧に説明して頂いてありがとうざいます。説明がくどくて申し訳ないなんてとんでもないです。本当に分かりやすい説明でおかげで私の様な者でも十分に理解することができました。yagmaさんには感謝×2です。ありがとうございました。
No.1
- 回答日時:
> 私のような者でも分かるように
私エスパーじゃないから
あなたがどんな人なのか分らないわ。
なのでちょっと噛み砕いて回答してみるわね。
> (int)(Math.random() * 10)で0~9の乱数が得られます。
この処理にはある大前提があるのね。それは
・Math.random()の実行結果が
0~0.999・・・に均一に出現すること。
そうすると次のばらつきが得られるわ。
0~0.09・・・
0.1~0.19・・・
~
0.9~0.99・・・
この10通りのばらつきがそれぞれ1/10の確率で出現するの。
この結果に対し
・(int)は小数点第一位の桁で切り捨てる
を行えば
0~9がそれぞれ1/10の確率で得られるわね。
ところで
・Math.random()の実行結果が
0~0.999・・・に均一に出現すること。
の前提は本当に成り立つの?という質問はダメよ。
成り立たなかったらそもそもこのメソッドの不具合ってことになるから。
同じような感じで
Math.random() * 6 + 1
もそう。
0~0.16・・・
0.167・・・~0.33・・・
~
と言う感じで
それぞれが1/6の確率で発生するのよ。
10は6で割り切れないって言いたい?
非連続な整数の世界ではそうなんだけど
連続した無限小数の世界では10は6で割り切れてしまうの。
こういう数学のお話は難しいかもしれないけど
そういうもんなんだってしぶしぶ納得して欲しいな。
連続な世界を解説しだすと本1冊じゃ足りないのよ。
ちょっと消化不良だけどこんな答えで大丈夫かな?
回答ありがとうございます。
Math.random() * 6 + 1もそう。
0~0.16・・・
0.167・・・~0.33・・・~
私には正直、まだこの文の意味がよく理解できません。
しかしながら疑問は解決できました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(ゲーム) ポケモン乱数 色違い 伝説 HGSS(ハートゴールド・ソウルシルバー) 1 2022/05/06 13:13
- 物理学 大学物理に詳しい方に質問です。 ラザフォードたちが実験で知りたかったことは衝突パラメータbと原子核の 1 2023/03/16 03:39
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- 数学 多変数関数の微分とテイラー展開について 5 2022/04/24 16:55
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- メガネ・コンタクト・視力矯正 コンタクトレンズの乱視補正について 1 2023/05/17 23:32
- その他(社会・学校・職場) 誰か聞いてください。 社会人6年目ですが、私はポンコツすぎますか? 上司にとあるAファイルの数式を全 1 2023/08/10 18:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
式の型は配列型で int に解決済...
-
Javaで素数の表を表示させたい...
-
偶数奇数の判定
-
ある年月の月間日数を取得する...
-
Java3Dで円錐台を描く方法を教...
-
コード中の謎のエラー
-
6桁の数字を重複なしでランダム...
-
分を表す数字(int型)を時間形...
-
Javaのファイル名チェックについて
-
コンストラクタ内で別のコンス...
-
javaの課題・・
-
java spring でエラーが出て困...
-
「配列定数は、イニシャライザ...
-
C#で、デリゲートからその関数...
-
行の途中から読み込む方法
-
iアプリでバイナリデータを16進...
-
C#で「型または名前空間名 'int...
-
java初心者の質問(3つの整数の...
-
javaでcsvファイル読込時の改行...
-
javaでカレンダー作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
式の型は配列型で int に解決済...
-
「配列定数は、イニシャライザ...
-
javaでcsvファイル読込時の改行...
-
java spring でエラーが出て困...
-
javaでカレンダー作成
-
Javaで電卓を作りたい
-
SwingでJtableのヘッダ行が表示...
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
C#で実行時にメソッドの返り値...
-
(Swing)JTextFieldを半角のみ入...
-
c# デリゲート関連の命名について
-
Javaでポインタ的なことはでき...
-
複数のボタンを配置し、それぞ...
-
JUnit4のアノテーションについて
-
javaのエラーの意味がわかりま...
-
intが負の時に投げる例外はあり...
-
sin曲線とcos曲線を描くプログ...
-
C++からC#のdllを参照する際、...
-
Java 初心者 int型の取り扱い方
おすすめ情報