Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

確率1/2

こんにちは。
javaで確率1/2で何かを行おうとしているのですが、これはMath.random()が0以上1未満の値なので、
if(Math.random() < 0.5){

}
else{
・・・
}
これで、確率1/2で〜か…が実行される、ということでいいのでしょうか。
特に一行目が<=か<かでちょっと迷ったのですが…。

あと、このrandom()って時々妙に偏っている気がするんですが、気のせいでしょうか^^;

8

回答

4157

閲覧

8件の回答

評価

0

int ret = Math.random() * 2;
switch {
 case 1: return true;
 case 0: return false;
}

数万回試行すれば偏ってるのかどうかはわかりますよ。
乱数==集合しない数というわけではないので。

種が同じ数値であれば固まる可能性は0ではありませんけどね。

評価

0

int ret = Math.random() * 2;
return ret == 1;

評価

0

>特に一行目が<=か<かでちょっと迷ったのですが…。
<で良いとは思いますが、doubleで示される小数点以下の桁数と、乱数のことを考えると、さほど意味のある点ではないですね。

>このrandom()って時々妙に偏っている気がする
標準で用意されている乱数は、どの言語でも偏りのひどいものです。
これらは、なるべく実装が簡単な方法でそれなりの効果を得るためのものであり、学術的な試行には用いられません。
周期が長く、一様に分布する乱数が欲しい場合は、メルセンヌ・ツイスタなど、代替手法を用います。

評価

0

補足ですが、コンピュータである以上、どう頑張っても、正確に一様な、予測不能な乱数を得ることはできません。
対象で必要とされる品質を得られるかどうか、です。

評価

0

>コンピュータである以上、どう頑張っても、正確に一様な、予測不能な乱数を得ることはできません。

電気的なノイズを取り入れて〜って方法があったような気が。たしかC3だったかC7だったか。
メジャーなCPUじゃない時点で微妙ですが。

評価

0

なるほど、その実装は知りませんでした。一様さはさておき、予測不能にはなりそうですね。
ところで、それは開発言語に提供されている(または容易に呼び出せる)機能なのでしょうか。

そういえば、Z80ではリフレッシュレジスタの値を使っていました。

評価

0

http://journal.mycom.co.jp/news/2003/01/22/15.html

詳しくは知りませんが、命令を直接叩くのかな・・・
Javaからは多分使えないでしょうね。

リフレッシュレジスタ・・・懐かしすぎですw

評価

0

皆さん、ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。