Aritalab:Lecture/Programming/Java/Random
From Metabolomics.JP
乱数の作成
Java プログラムで乱数を発生させるには Random クラスを使います。以下のプログラムは 50 ステップのランダムウォークを 1000 回繰り返し、結果を 5 行ずつまとめて積算して表示します。
import java.util.Random; public class RandomWalk { int max = 100; // 試行回数 int[] result = new int[max];// 結果を格納する配列 Random rand = new Random(); void binomial(double p) { // 二項分布を作る関数 for (int k = 0; k < max * 10; k++) { // 施行を max * 10 回繰り返す int n = 0; // 確率 p で +1, (1-p)で -1 を max/2 ステップ for (int i = 0; i < max / 2; i++) if (rand.nextDouble() > p) ++n; else --n; // ウォーク後の位置を記録 result[n + max / 2 - 1]++; } }
乱数発生用に Random クラスを使っています。 Random クラスは以下のメソッドを備えます。
- nextInt() ランダムな整数を生成
- nextInt(int n) 0 から n までのランダムな整数を生成
- nextDouble(), nextFloat() 0 から 1 の間でランダムな実数を生成
- nextGaussian() 平均 1, 分散 1 の正規分布に従う乱数を生成
最初に
Random rand = new Random();
としてRandom クラスの実体を一つ作成し、rand に対して上記のメソッドを繰り返し適用して乱数を発生させます。上のプログラムで引数として与えている 0.5 を 0.8 などにすると、分布が偏ることが観測できます。 ウォークの最終位置は、 result 配列に記録されています。
String makeString(char c, int length) { // 文字 c を繰り返して長さ length の文字列を作成 StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) sb.append(c); return sb.toString(); } void print() { // プリントアウト int line = 20; // 全体を20行で表示 for (int i = 0; i < line; i++) { int sum = 0; for (int j = (i * max) / line; j < ((i + 1) * max) / line; j++) sum += result[j]; if (sum / 10 == 0) continue; String s = makeString('*', sum / 10); int pos = i - (line/2); System.out.println(pos + ":" + s); } }
結果を表示する際、result 配列の中身全てを出力すると多すぎるので全体を20行にするよう積算します。max=100行あるresult配列を、20行にするため、(max/line) = 5 行ずつ積算します。 表示のとき、値が 10 以下だったらスキップし、 そうでない場合は 10 毎に一つアスタリスク * を表示します。
static public void main(String[] args) { RandomWalk rw = new RandomWalk(); rw.binomial(0.5); rw.print(); } }