Aritalab:Lecture/Programming/Java/Random
From Metabolomics.JP
< Aritalab:Lecture | Programming | Java(Difference between revisions)
m |
m |
||
Line 14: | Line 14: | ||
void binomial(double p) | void binomial(double p) | ||
{ // 二項分布を作る関数 | { // 二項分布を作る関数 | ||
− | for (int k = 0; k < max * 10; | + | for (int k = 0; k < max * 10; k++) |
{ // 施行を max * 10 回繰り返す | { // 施行を max * 10 回繰り返す | ||
int n = 0; | int n = 0; | ||
// 確率 p で +1, (1-p)で -1 を max/2 ステップ | // 確率 p で +1, (1-p)で -1 を max/2 ステップ | ||
− | for (int i = 0; i < max / 2; | + | for (int i = 0; i < max / 2; i++) |
if (rand.nextDouble() > p) | if (rand.nextDouble() > p) | ||
− | + | ++n; | |
else | else | ||
--n; | --n; | ||
Line 46: | Line 46: | ||
{ // 文字 c を繰り返して長さ length の文字列を作成 | { // 文字 c を繰り返して長さ length の文字列を作成 | ||
StringBuffer sb = new StringBuffer(); | StringBuffer sb = new StringBuffer(); | ||
− | for (int i = 0; i < length; | + | for (int i = 0; i < length; i++) |
sb.append(c); | sb.append(c); | ||
return sb.toString(); | return sb.toString(); | ||
Line 54: | Line 54: | ||
{ // プリントアウト | { // プリントアウト | ||
int line = 20; // 全体を20行で表示 | int line = 20; // 全体を20行で表示 | ||
− | for (int i = 0; i < line; | + | for (int i = 0; i < line; i++) |
{ | { | ||
int sum = 0; | int sum = 0; | ||
for (int j = (i * max) / line; j < ((i + 1) * max) | for (int j = (i * max) / line; j < ((i + 1) * max) | ||
− | / line; | + | / line; j++) |
sum += result[j]; | sum += result[j]; | ||
if (sum / 10 == 0) | if (sum / 10 == 0) |
Latest revision as of 14:48, 20 December 2011
[edit] 乱数の作成
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(); } }