アプリ版:「スタンプのみでお礼する」機能のリリースについて

(int)(Math.random() * 10)で0~9の乱数が得られます。
この意味が全く理解できません。
乱数をキーワードに検索を続けていくと下記のような投稿を見つけました。
さいころの目を題にしたものがあると思うのですが、
その場合、Math.random() * 6 + 1 と回答されていると思います。
それは、
0~5までの乱数を作成し、作成された乱数に1を加算していて、
乱数:Math.random() * (max - min + 1) + min
という計算式を元に考えられているのですよね?
ますます意味が分かりません。
どなたか私のような者でも分かるように噛み砕いて説明して頂けないでしょうか?
疑似乱数が何かとか、乱数の種類には何があってとか説明されても分からないと思います。
まずは上記の内容について説明頂きたいです。くだらない質問ですみませんが宜しくお願い申し上げます。

A 回答 (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の値になるということです。

少し説明がくどくなりましたね。申し訳ないです。
    • good
    • 0
この回答へのお礼

yagumaさん、ご丁寧に説明して頂いてありがとうざいます。説明がくどくて申し訳ないなんてとんでもないです。本当に分かりやすい説明でおかげで私の様な者でも十分に理解することができました。yagmaさんには感謝×2です。ありがとうございました。

お礼日時:2009/02/23 03:35

> 私のような者でも分かるように


私エスパーじゃないから
あなたがどんな人なのか分らないわ。
なのでちょっと噛み砕いて回答してみるわね。

> (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冊じゃ足りないのよ。


ちょっと消化不良だけどこんな答えで大丈夫かな?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
Math.random() * 6 + 1もそう。
0~0.16・・・
0.167・・・~0.33・・・~
私には正直、まだこの文の意味がよく理解できません。
しかしながら疑問は解決できました。ありがとうございました。

お礼日時:2009/02/23 03:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!