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

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

ただいまの
回答率

88.19%

Java 乱数生成

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 3,157

rion

score 30

Javaで、特定の範囲内の値から乱数を生成しようとしています。

例えば範囲が5-10としたら、乱数が取ってくることのできる最小の数が5、最大の数が10、且つ5と10の間のどの数字にでもなれるようにしたいのですが、どう実装したらいいかわからず困っています。

ある特定の範囲内の乱数を返すようなAPIはあるのでしょうか?
下記のような実装を試してみたのですが、上手くいきませんでした。
 ※ minが最小値、maxが最大値

処理A:
num = min + (int)(Math.random()*max); 
→この場合、numにmaxよりも大きな値が取れてしまう。

処理B:
Random random = new Random();
int i = max - min + 1;
int j = random.nextInt() % i;
num = min + j;
→この場合、numにminより小さい値が取れてしまう。

宜しくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+3

google で "java random" で検索した結果のページから、次のものを見つけました。

乱数の作成
...
10~19などの0からはじめたくない場合は、生成した乱数に開始したい整数をプラスすることで実現できます。
...

乱数を取得する
...
Randomクラス主要メソッド
   nextInt(int i)     0 ~ i-1 の範囲で乱数を取得する
...

こういった情報を自分で検索し、その情報をもとにコードを作ってみて、自分で動作確認する
ということができるようになると 作業効率が上がると思います。


投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2014/08/20 09:44

    プラスするのは確かに!って納得しました!分かりやすい回答ありがとうございました!

    キャンセル

+1

以下コードで実現できるかと思います。
min + (int)(Math.random() * ((max - min) + 1))
ここでやっている内容を説明すると、
まずMath.random()の仕様として、(0,1)の範囲のdouble型の値を生成します。
※この範囲には1を含まないということに注意してください

指定の値の範囲を得るために、まず値の範囲を乗算し、欲しい値の範囲に拡張してみてください。
Math.random() * ( max - min )
そうすると、[0,max-min]という範囲の値が返されます。
範囲内の最小値を取る為に、minの値を足します。
min + (Math.random() * (max - min))
これでmin値〜max値という範囲の値を得ることができます。
しかし、この状態ではまだ最大値が含まれず、double型の値を取ってきてしまいます。
最大値を含めるために範囲を算出する部分の(max - min)に1を足し、小数部分をキャストで切捨てて整数にする必要があります。
min + (int)(Math.random() * ((max - min) + 1))
これでOKです。
質問例の5〜10を当てはめると、以下のような式になります。
5 + (int)(Math.random() * ((10 - 5) + 1))

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

標準的なやり方は、takeda.dさんとkatoyさんのお書きになった内容の通りです。


どうしてもnからmまで(5~10)の乱数を得る、のように直観的なメソッドが欲しいときには、Apache Commons Math のnextIntを使う手もあります。
RandomDataGenerator (Apache Commons Math 3) ※英語

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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