- PR -

指定した範囲の乱数

1
投稿者投稿内容
death
会議室デビュー日: 2005/06/15
投稿数: 15
投稿日時: 2005-11-18 13:14
java初心者です。

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

教えてください。よろしくお願いします。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-11-18 13:28
できますよ。
というか、ベンダーから便利なユーティリティークラスが提供されるまでは、
みんな、自分で「0.0以上1.0未満」の乱数を、目的の数値に変換するコードを
書いてたんですよねえ・・・。
こういうことは、自分でもできた方がいいと思う。
以下のようなものもあります。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Random.html
death
会議室デビュー日: 2005/06/15
投稿数: 15
投稿日時: 2005-11-18 13:37
ありがとうございました。
大変助かりました!!

永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-11-18 13:45
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さんから簡潔な返答が出て解決済みだった……
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-11-18 14:01
http://www001.upp.so-net.ne.jp/isaku/rand.html
に詳しく書かれていますが、Javaの乱数は、実はバグがあって
初回の数値には偏りがあるので、二回目以降の値を使った方がいいです。(たぶん)
yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2005-11-18 15:38
引用:

http://www001.upp.so-net.ne.jp/isaku/rand.html



試してみました。
種の値が近いと、直後の値も似たような値が出てきました。
1回目の値は捨てた方がよさそうです。
Kit
会議室デビュー日: 2005/08/19
投稿数: 12
投稿日時: 2005-11-18 17:37
参考に。

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
1

スキルアップ/キャリアアップ(JOB@IT)