QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

指定した範囲の乱数

java初心者です。

指定した範囲の乱数を取得する方法って、どうすればできますか?
Mathクラスのrandom()メソッドを使ってするのですか?

教えてください。よろしくお願いします。

質問者:death

回答

できますよ。
というか、ベンダーから便利なユーティリティークラスが提供されるまでは、
みんな、自分で「0.0以上1.0未満」の乱数を、目的の数値に変換するコードを
書いてたんですよねえ・・・。
こういうことは、自分でもできた方がいいと思う。
以下のようなものもあります。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Random.html

投稿者:Edosson

編集 履歴 (0)

ありがとうございました。
大変助かりました!!

投稿者:death

編集 履歴 (0)

Google(「java」「乱数」での検索結果)
http://www.google.co.jp/search?hl=ja&q=java+%E4%B9%B1%E6%95%B0&lr=

私が検索した際に最上位に表示されたページ
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Random.html

多分、正数の話だと思うので、ページ内アンカ
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Random.html#nextInt()

ところで、そのページ内の記述より

ほとんどのアプリケーションでは、クラス Math の random メソッドを使う方が簡単です。

なので
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Math.html#random()

以上で普通は大丈夫だと思いますが、もうちょっと詳しく書くと
http://www.atmarkit.co.jp/fjava/rensai2/jspservlet07/jspsevlet07_3.html
内、「ロジックの概要」より

Math#randomメソッドは0.0〜1.0の範囲の乱数を生成しますが、ここでは生成された乱数に100を掛け、roundメソッドで小数点以下を切り捨てることで、0〜100の整数値を取得しています。

説明の中で出てくるroundやfloorに関しては、適宜追いかけてください。

もうちょっと突っ込んだところに行くと
http://cwoweb2.bai.ne.jp/~jgb11101/files/random/mersenne_applet.html
というような話もあるようです。

---

とか、だらだら書いていたら、すでにEdossonさんから簡潔な返答が出て解決済みだった……

投稿者:永井和彦

編集 履歴 (0)

http://www001.upp.so-net.ne.jp/isaku/rand.html
に詳しく書かれていますが、Javaの乱数は、実はバグがあって
初回の数値には偏りがあるので、二回目以降の値を使った方がいいです。(たぶん)

投稿者:おっきー

編集 履歴 (0)

参考に。

Javaでは線形合同法という乱数を作成する方法が採用されています。

線形合同法は
R = (A × 種 + C) mod P
という計算のやり方で乱数を作っています。

線形合同法はあまりよい乱数が作成できません。
その理由は周期が存在するからです。
分かりやすい例を示すために以下のようにおきます。
A=3、C=0、P=7、種=5

R0 = (3×5+0) mod 7
  = 15 mod 7
  = 1
したがってR0 =1

次からは種の部分に前の値がきます。つまりR0が種の値となります。
R1 =(3×1+0) mod 7
  =3 mod 7
  =3
したがってR1 =3

R2 =(3×3+0) mod 7
  =9 mod 7
  =2

R3 =(3×2+0) mod 7
  = 6 mod 7
  =6

R4 =(3×6+0) mod 7
  =18 mod 7
  =4

R5 =(3×4+0) mod 7
  =12 mod 7
  =5

R6 =(3×5+0) mod 7
  =15 mod 7
  =1

R7 =(3×1+0) mod 7
  =3 mod 7
  =3

R8 = 2
R9 = 6..........と{1,3,2,6,4,5,1,3,2,6,4,5...........}の繰り返しがでてしまいます。
もし乱数に興味をもったら参考にこの本を読んでみるといいと思います。
こちらの本は大変な良書だと思います。
http://www.hyuki.com/cr/

上の書物は具体的な設計図(アルゴリズム)が記載されていないのでもっと詳しい本はこちらになります。
http://www.amazon.co.jp/exec/obidos/ASIN/4797319119/249-2416039-9161930

またMathクラスを使うよりはRandomクラスを使ったほうがよりプログラムを作成しやすくなります。
もしソースコードをご希望なら書き込みますので言って下さい。p(^_^)q

投稿者:Kit

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。