モンテカルロシミュレーションの基礎(乱数の発生と性質)


  1. シミュレーションとは


  2. 乱数(確率)を利用したシミュレーション = モンテカルロ法
    例えば、

  3. 乱数の発生方法
    コンピュータによる乱数発生 → あるルールに従う → 疑似乱数

  4. 疑似乱数に必要とされる条件

  5. 乱数を発生させる組込み関数

    組込み関数(rand(), random()など)の使い方
    →manコマンドでrand, randomについて調べてみよ。(関数の型、発生する乱数値の範囲、周期、注意事項など)

    例1)0〜1の範囲の値をもつ100個の乱数を発生し表示するプログラム
    #include <stdio.h>
    #include <stdlib.h> /* rand()を利用するために必要*/
    #define MAXNUM (32768-1) /* rand() の発生する乱数値の最大値*/
    main()
    {
      int i;
      srand(55); /* seed(種)=乱数の系列を決める値を与える*/
      for(i = 0; i < 100; ++i)
        printf("%lf\n", (double)rand()/MAXNUM);
    }
    


    例2)乱数の分布と平均値を求めるプログラム
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXNUM1 (32768-1)
    #define MAXNUM2 (2147483648-1)
    main()
    {
      int i, j, number, bunpu[10][2];
      double r1, r2, sum1, sum2, a[2];
      printf("Num = "); scanf("%d", &number);
      for(i = 0; i < 10; ++i)
        for(j = 0; j < 2; ++j)
          bunpu[i][j] = 0;
      a[0]=0; a[1]=0;
      srand(55);
      srandom(1);
      for(i = 0; i < number; ++i){
        r1 = (double)rand()/MAXNUM1*10.0;
        r2 = (double)random()/MAXNUM2*10.0;
        bunpu[(int)(r1)][0]++;
        bunpu[(int)(r2)][1]++;
        sum1 = sum1 + r1; 
        sum2 = sum2 + r2; 
      }
      a[0] = sum1/(number + 1)/10;
      a[1] = sum2/(number + 1)/10;
    
      for(j = 0; j < 2; ++j){
        for(i = 0; i < 10; ++i){
          printf("%5d  ",bunpu[i][j]);
        }
        printf("  %.5lf", a[j]);
        printf("\n");
      }
    }
    


  6. 乱数を利用したモンテカルロ法において取り組む課題1 =「強磁性体のイジングモデル」


  7. 練習問題
    20×20の2次元格子(配列)を用意し、各々の要素のスピンの向きを乱数(組込み関数を利用してよい)を利用してランダムに決定し、表示するプログラムを作成せよ。具体的には、0から1までの乱数を発生させて、その乱数が0.5未満であればその格子点は○、0.5以上 であれば●とする。それを20×20の格子点について行い出力すると例えば以下の表示を得る。
    出力結果の例:
    ○●●○●○○○○○○○○○●○○●○○
    ○○●○○●○●●●○●●○○○○●●○
    ●●●●○○●○○○●○●●●●○○●○
    ○●○○●●○○○●●○●●●●●●○●
    ●●○○○○●●●●●○○●○●●●○●
    ●●○●○○○○●●○●●●○○○○●○
    ●○●●●●○●○●●○●●○○●●○○
    ○●○●○○○●●○●●○○○●●○●○
    ●○○●○○○○●○○●●○○○○○○●
    ○●○●○○○○○●○○●●●○●●○●
    ●●●●●○○○○●●○○○●●●●●○
    ○○●●●●○●○○●○●○○○●●○●
    ○●●○○●○●●●●●●●●○●○●○
    ○●○●○●○●○○○●○●○●●●○○
    ○○○○○○●●●○●○○●○○●○○○
    ○○○○○●○●●●○○●○●○○○○●
    ●○●○○○○○○●○○○○●○○○○○
    ○●○●●●○○○●●●●○○○○○○○
    ●○○○●●●●○○●○●○○○○○●○
    ●○●●○●○○●○○○●○●○○○○●
    
The answer is here