上記の参考サイトの
「0~3の整数」を生成するには、「0~4未満の実数」を以下のように作成し、
Math.random()*4;
これをint型にキャストすればよい。
(int)(Math.random()*4);
という個所を見て思ったのですが、
これはMath.Random()で0.0<1.0のランダムな数値をとって、
こいつを4倍し、少数点以下を切り捨てるという処理だと思うのですが、
桁が上がった場合、単純に
Math.radom()*60000;
これをint型にキャストすればよい。
(int)(Math.random()*60000)ってことになるわけもないですよね。
「060000の整数」を生成するための、「060000未満の実数」を作成したい場合どうすればよいでしょうか。
お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
出来る限り品質のよい乱数を得るには、java.util.Randomを使うことはおすすめしません。
http://koiroha.blogspot.jp/2017/05/java-random-deviation-probrem.html
SecureRandomというクラスもありますが、これは生成される乱数の品質が良い代わりに超遅いです。
ゲーム製作などの現場では、出来る限り品質の高い、かつ計算速度が速い、かつ同シード値から同一の乱数配列が取れる乱数生成方法としてメルセンヌ・ツイスタがよく挙げられます。しかし、Javaの標準機能にメルセンヌ・ツイスタを使ったクラスは存在しないため、なんらかの外部ライブラリを使うか、自分でメルセンヌ・ツイスタを使った乱数生成コードを実装する必要があります。
【乱数の偏りについての参考記事】
https://qiita.com/isonami/items/1cc278cbf2093d2d6abd
【メルセンヌ・ツイスタのJava実装の一例】
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/JAVA/java.html
※ソースコードは中ほどのMTRandom.javaというリンク
投稿2017/11/21 06:10
編集2017/11/21 06:18総合スコア9206
0
この乱数ジェネレータのシーケンスを使って、0から指定された値の範囲(0は含むが、その指定された値は含まない)で一様分布のint型の擬似乱数値を返します。nextIntの一般規約では、指定された範囲内の1つのint型の値が擬似乱数として生成されて返されます。bound個のすべての可能なint値が(ほぼ)均等な確率で生成されます。nextInt(int bound)メソッドは、Randomクラスによって次のように実装されます。
かしら?
投稿2017/11/21 05:53
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
(int)(Math.random()*60000)
アバウトにはこれでも構いません(浮動小数点数の取りうる値の関係上、完全に均等とはなりませんが)。ただ、本格的に使いたいなら、java.util.Random()
インスタンスを用意した方がいいでしょう。
java
1Random source = new Random(); 2int randomInt = source.nextInt(60000);
実数の場合、何をもって「均等」というかが難しくなってきます(浮動小数点数という都合上、とりうる値の間隔は大きな数ほど隙間が空いてきます)。アバウトでいいならMath.random()*60000
で構いません。
投稿2017/11/21 05:51
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/21 06:07
0
ベストアンサー
Random#nextIntでは要件に合わないでしょうか。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Random.html#nextInt-int-
追記:
masaya_ohashiさんのご回答の通り、乱数生成には色々な考慮が必要です。
リンク頂いているJava 標準 Random の乱数偏り問題
の記事にも記載がありますが、
Random#nextIntは、おおよそ一様に分布します。
また、メルセンヌ・ツイスタ以外の疑似乱数生成アルゴリズムとしては、例えばXorshift等も有名かと思います。
投稿2017/11/21 05:50
編集2017/11/21 07:20退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
(int)(Math.random()*60000)ってことになるわけもないですよね。
ってことになると思いますが、なぜならないと思うのでしょうか?
投稿2017/11/21 05:52
総合スコア16731
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/21 06:05 編集
2017/11/21 06:13
2017/11/21 06:17 編集
2017/11/21 07:19 編集
2017/11/21 07:25
2017/11/21 07:46
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/21 06:18 編集