質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • Java

    10442questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

java Random()で整数60000までのランダムの数値を完全性で出力するにはどうすればよいですか

解決済

回答 5

投稿 2017/11/21 14:41

  • 評価
  • クリップ 0
  • VIEW 258

King_of_Flies

score 251

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+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というリンク

投稿 2017/11/21 15:10

編集 2017/11/21 15:18

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/21 15:18 編集

    C言語のrand()ほどではないにしても、「互換上1度実装したアルゴリズムを変えられない」結果残念なことになっているケースは多いですね…

    PHPのmt_randも、間違ったままの実装をPHP7.1でも選べるようになっている、とのことですし。

    http://php.net/manual/ja/function.mt-srand.php

    キャンセル

+3

java.util.Random#nextInt(int)

この乱数ジェネレータのシーケンスを使って、0から指定された値の範囲(0は含むが、その指定された値は含まない)で一様分布のint型の擬似乱数値を返します。nextIntの一般規約では、指定された範囲内の1つのint型の値が擬似乱数として生成されて返されます。bound個のすべての可能なint値が(ほぼ)均等な確率で生成されます。nextInt(int bound)メソッドは、Randomクラスによって次のように実装されます。

かしら?

投稿 2017/11/21 14:53

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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等も有名かと思います。

投稿 2017/11/21 14:50

編集 2017/11/21 16:20

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/21 16:22

    nextIntの使い勝手がよさそうなので、一番最初に回答してくださった方にBAを差し上げることにしました。

    ありがとうございます。

    キャンセル

+2

(int)(Math.random()*60000)

アバウトにはこれでも構いません(浮動小数点数の取りうる値の関係上、完全に均等とはなりませんが)。ただ、本格的に使いたいなら、java.util.Random()インスタンスを用意した方がいいでしょう。

Random source = new Random();
int randomInt = source.nextInt(60000);

実数の場合、何をもって「均等」というかが難しくなってきます(浮動小数点数という都合上、とりうる値の間隔は大きな数ほど隙間が空いてきます)。アバウトでいいならMath.random()*60000で構いません。

投稿 2017/11/21 14:51

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/21 15:13 編集

    計算機の乱数計算の一様性という意味ですと十分満足いくように一様にするのが難しいという話はあると思いますが、maisumakunさんがおっしゃっている以下の点については問題はないと思います。(ほぼという意味合いで)
    > 浮動小数点数という都合上、とりうる値の間隔は大きな数ほど隙間が空いてきます
    というのはrandom()の実装は53bitの整数を生成し、それを0.0~1.0になるようにスケーリングしているからです。この実装においては2進数としての末尾の誤差はありますが生成される数値は可能な限り一様になっているといえるのではないでしょうか?

    キャンセル

  • 2017/11/21 15:07

    あ・・・でもnextInt(60000)の方が適切という意見には同意です!

    キャンセル

+1

(int)(Math.random()*60000)ってことになるわけもないですよね。

ってことになると思いますが、なぜならないと思うのでしょうか?

投稿 2017/11/21 14:52

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/21 15:05 編集

    Math.random()で取得できる値は0~1未満の実数ということなので、
    0,0.1,0.2,0.3,0.4,…0.9までを取得しますよね。
    0.1に60000を掛けてint型にキャストしても6000が返ってきませんか?

    キャンセル

  • 2017/11/21 15:13

    > 0,0.1,0.2,0.3,0.4,…0.9までを取得しますよね。

    「0.5576118308783207」とか「0.9369795477265435」とか、下の位までランダムです。

    キャンセル

  • 2017/11/21 15:17 編集

    @King_of_Flies さん
    返ってきますけど、それが何か?
    「0以上1未満の実数」 * 60000 = 「0以上60000未満の実数」で、これをintでキャスト(切り捨て)すると「0以上59999以下」のint(整数)になります。

    キャンセル

  • 2017/11/21 16:19 編集

    @fuzzball
    >返ってきますけど、それが何か?

    0のとき0,
    0.1のとき6000,
    0.2のとき12000,
    0.3のとき18000,
    //略
    0.9のとき、54000となると、
    1とか2とか取得できなくないですか?という事を疑問に思ったのですが、
    上のmaisumakunさんの回答で実数の勘違いをしていたことに気付いたので解決しました。


    あと、言い方がキツくて怖いです。

    キャンセル

  • 2017/11/21 16:25

    怖くないですよw

    キャンセル

  • 2017/11/21 16:46

    攻め立てる意図がなくてよかったです。

    >返ってきますけど、それが何か?

    (なんでそんなことも分かんないのこのカスは)くらいの意味を感じました・・・

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

  • 解決済

    Java 乱数生成

    Javaで、特定の範囲内の値から乱数を生成しようとしています。 例えば範囲が5-10としたら、乱数が取ってくることのできる最小の数が5、最大の数が10、且つ5と10の間のどの

  • 解決済

    重複しない乱数の発生方法(Collections.shuffleの処理速度)

    リストをシャッフルする Collections.shuffle というメソッドがありますが、かなり大量のリスト(1000以上)をシャッフルするとなるとやはり処理時間がかかるでし

  • 解決済

    00

    oooooooooooooooooooooooooooooooooooooooo

  • 解決済

    配列へランダムに数字を入れたいです。

    前提・実現したいこと javaで156個の配列にランダムでそれぞれ1~13の数字を同じ数だけ入れたいです。 マークが関係なくジョーカーが入っていないトランプを3組混ぜるイメージ

  • 解決済

    直線の描き方

    ある線に対してある角度の線を引きたい場合どのようにすればいいのでしょうか? 例えば g.drawLine(100, 100, 200, 200); 点(100, 100)

  • 解決済

    JAVAのコードで分からない問題があります

    前提・実現したいこと コードガールコレクションのJAVAの問題で分からないことがあります。教えてください。 発生している問題・エラーメッセージ ランダムな整数を三個出力し

  • 解決済

    やり方がわかりません

    改行区切りのやり方がわかりません public class Main { public static void main(String[] args) throws Exc

  • 解決済

    ゲーム「Hit&Blow」の作成

    前提・実現したいこと 課題の数当てゲーム「Hit&Blow」を作成しています。 「Hit&Blow」とは、n桁の数字の順番と数が合っていればHit、数字が合っているが桁が異なる

同じタグがついた質問を見る

  • Java

    10442questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • トップ
  • Javaに関する質問
  • java Random()で整数60000までのランダムの数値を完全性で出力するにはどうすればよいですか