Aritalab:Lecture/Programming/Java/Random

From Metabolomics.JP
< Aritalab:Lecture | Programming | Java(Difference between revisions)
Jump to: navigation, search
m (Created page with "==乱数の作成== Java プログラムで乱数を発生させるには Random クラスを使います。 <pre> import java.util.Random; public class RandomWalk { int...")
 
m
 
(5 intermediate revisions by one user not shown)
Line 1: Line 1:
 
==乱数の作成==
 
==乱数の作成==
  
Java プログラムで乱数を発生させるには Random クラスを使います。
+
Java プログラムで乱数を発生させるには Random クラスを使います。以下のプログラムは 50 ステップのランダムウォークを 1000 回繰り返し、結果を 5 行ずつまとめて積算して表示します。
  
 
<pre>
 
<pre>
Line 8: Line 8:
 
public class RandomWalk
 
public class RandomWalk
 
   {
 
   {
     int max = 100;
+
     int max = 100; // 試行回数
     int[] result = new int[max];
+
     int[] result = new int[max];// 結果を格納する配列
 
     Random rand = new Random();
 
     Random rand = new Random();
  
 
     void binomial(double p)
 
     void binomial(double p)
 
       { // 二項分布を作る関数
 
       { // 二項分布を作る関数
         for (int k = 0; k < max * 10; k++)
+
         for (int k = 0; k < max * 10; k&#43;&#43;)
 
           { // 施行を 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; i++)
+
             for (int i = 0; i < max / 2; i&#43;&#43;)
 
               if (rand.nextDouble() > p)
 
               if (rand.nextDouble() > p)
                 ++n;
+
                 &#43;&#43;n;
 
               else
 
               else
 
                 --n;
 
                 --n;
 +
            // ウォーク後の位置を記録
 
             result[n + max / 2 - 1]++;
 
             result[n + max / 2 - 1]++;
 
           }
 
           }
 
       }
 
       }
 +
</pre>
 +
乱数発生用に 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 配列に記録されています。
 +
 +
<pre>
 
     String makeString(char c, int length)
 
     String makeString(char c, int length)
 
       { // 文字 c を繰り返して長さ length の文字列を作成
 
       { // 文字 c を繰り返して長さ length の文字列を作成
 
         StringBuffer sb = new StringBuffer();
 
         StringBuffer sb = new StringBuffer();
         for (int i = 0; i < length; i++)
+
         for (int i = 0; i < length; i&#43;&#43;)
 
           sb.append(c);
 
           sb.append(c);
 
         return sb.toString();
 
         return sb.toString();
Line 38: Line 54:
 
       { // プリントアウト
 
       { // プリントアウト
 
         int line = 20; // 全体を20行で表示
 
         int line = 20; // 全体を20行で表示
         for (int i = 0; i < line; i++)
+
         for (int i = 0; i < line; i&#43;&#43;)
 
           {
 
           {
 
             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; j++)
+
                 / line; j&#43;&#43;)
 
               sum += result[j];
 
               sum += result[j];
 
             if (sum / 10 == 0)
 
             if (sum / 10 == 0)
 
               continue;
 
               continue;
 
             String s = makeString('*', sum / 10);
 
             String s = makeString('*', sum / 10);
             System.out.println(i + ":" + s);
+
            int pos = i - (line/2);
 +
             System.out.println(pos + ":" + s);
 
           }
 
           }
 
       }
 
       }
 +
</pre>
 +
結果を表示する際、result 配列の中身全てを出力すると多すぎるので全体を20行にするよう積算します。max=100行あるresult配列を、20行にするため、(max/line) = 5 行ずつ積算します。
 +
表示のとき、値が 10 以下だったらスキップし、 そうでない場合は 10 毎に一つアスタリスク * を表示します。
  
 +
<pre>
 
     static public void main(String[] args)
 
     static public void main(String[] args)
 
       {
 
       {
Line 59: Line 80:
 
   }
 
   }
 
</pre>
 
</pre>
 
Random クラスは以下のメソッドを備えています。
 
* nextInt() ランダムな整数を生成
 
* nextInt(int n) 0 から n までのランダムな整数を生成
 
* nextDouble(), nextFloat()  0 から 1 の間でランダムな実数を生成
 
 
最初に
 
 
Random R = new Random();
 
 
としてRandom クラスの実体を一つ作成し、R に対して上記のメソッドを繰り返し適用して乱数を発生させています。
 

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();
      }
  }
Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox