java Random()で整数60000までのランダムの数値を完全性で出力するにはどうすればよいですか
解決済
回答 5
投稿
- 評価
- クリップ 0
- VIEW 3,278
http://ysklog.net/java/4-15.html
上記の参考サイトの
「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)ってことになるわけもないですよね。
「0~60000の整数」を生成するための、「0~60000未満の実数」を作成したい場合どうすればよいでしょうか。
お願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+4
この乱数ジェネレータのシーケンスを使って、0から指定された値の範囲(0は含むが、その指定された値は含まない)で一様分布のint型の擬似乱数値を返します。nextIntの一般規約では、指定された範囲内の1つのint型の値が擬似乱数として生成されて返されます。bound個のすべての可能なint値が(ほぼ)均等な確率で生成されます。nextInt(int bound)メソッドは、Randomクラスによって次のように実装されます。
かしら?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+4
出来る限り品質のよい乱数を得るには、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というリンク
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
+2
Random#nextIntでは要件に合わないでしょうか。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Random.html#nextInt-int-
追記:
masaya_ohashiさんのご回答の通り、乱数生成には色々な考慮が必要です。
リンク頂いているJava 標準 Random の乱数偏り問題
の記事にも記載がありますが、
Random#nextIntは、おおよそ一様に分布します。
また、メルセンヌ・ツイスタ以外の疑似乱数生成アルゴリズムとしては、例えばXorshift等も有名かと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
(int)(Math.random()*60000)
アバウトにはこれでも構いません(浮動小数点数の取りうる値の関係上、完全に均等とはなりませんが)。ただ、本格的に使いたいなら、java.util.Random()
インスタンスを用意した方がいいでしょう。
Random source = new Random();
int randomInt = source.nextInt(60000);
実数の場合、何をもって「均等」というかが難しくなってきます(浮動小数点数という都合上、とりうる値の間隔は大きな数ほど隙間が空いてきます)。アバウトでいいならMath.random()*60000
で構いません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
(int)(Math.random()*60000)ってことになるわけもないですよね。
ってことになると思いますが、なぜならないと思うのでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる