Search Bloguru posts

C言語学習ノート

http://en.bloguru.com/c-language

ポアソン乱数

thread
/*
    ポアソン乱数のサンプルプログラムです。

ポアソン乱数とは、離散的な自然現象
(ある領域やある時間内において0回、1回、2回… と発生する現象)
に該当する乱数です。

*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <float.h>

/* マクロ */
#define UNIT_RND() (rand()/(RAND_MAX+1.0))

/*
    poisson_rnd

    ポアソン乱数を発生させる

    *戻り値
        int: 発生した乱数(回数/単位時間)
    *引数
        double x: 平均回数/単位時間
    *補足
        オーバーフローした場合,0を返す
*/
int poisson_rnd(double n)

    int k = 0;
    n = exp(n) * UNIT_RND();
    if (n == HUGE_VAL) {
        return k;
    }
    while (n > 1) {
        n *= UNIT_RND();
        k++;
    }
    return k;


/*
    メイン
*/
int main(int argc, char *argv[])

    int n;
    int i;
    int j;

    /* 入力チェック */
    if (argc < 2) {
        printf(”error\n”);
        return EXIT_FAILURE;
    }

    n = atoi(argv[1]);  /* 第1パラメータ,乱数最大値 */
    if (n < 0) {
        printf(”error\n”);
        return EXIT_FAILURE;
    }

    /* 乱数種を設定 */
    /* 毎回異なる乱数を発生させるためにtime()を種に */
    srand(time(NULL));

    /* 乱数を100個発生 */
    for (i=0;i<10;i++) {
        for (j=0;j<10;j++) {
            printf(”%d ”, poisson_rnd(n));
        }
        printf(”\n”);
    }

    return EXIT_SUCCESS;


People Who Wowed This Post

正規乱数

thread
/*
    正規乱数のサンプルプログラムです。

G.E.P.ボックスとM.E.マラーの極座標法により、
正規乱数を発生します。

*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <float.h>

/* マクロ */
#define UNIT_RND() (rand()/(RAND_MAX+1.0))
#define PI (3.14159265358979323846264)

/*
    normal_rnd

    正規乱数を発生させる

    *戻り値
        double: 発生した乱数
    *引数
        double x: 倍率
    *補足
        特になし
*/
double normal_rnd(double x)

    static int f = 0;
    static double k;
    static double q;

    if (f) {
        f = 0;
        return x * k * sin(q);
    }

    f = 1;
    k = sqrt(−2 * log(1 − UNIT_RND()));
    q = 2 * PI * UNIT_RND();
    return x * k * cos(q);


/*
    メイン
*/
int main(int argc, char *argv[])

    int i;
    int j;

    /* 乱数種を設定 */
    /* 毎回異なる乱数を発生させるためにtime()を種に */
    srand(time(NULL));

    /* 乱数を100個発生 */
    for (i=0;i<10;i++) {
        for (j=0;j<10;j++) {
            /* 引数1で呼び出せば平均0,分散1の標準正規分布となる */
            printf(”%f ”, normal_rnd(1));
        }
        printf(”\n”);
    }

    return EXIT_SUCCESS;


People Who Wowed This Post

0.0〜任意の数までの実数の乱数発生

thread
/*
    0.0〜任意の数までの実数の乱数発生サンプルプログラムです。

0〜任意の数までの間の実数の乱数を発生させるためには、
任意の実数をRAND_MAXで割り,rand()の値をかけます。
RAND_MAXで先に割るのは,オーバーフローを避けるためです。

*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* マクロ */
#define REAL_RND(x) ((double)(x)/RAND_MAX*rand())

/*
    real_rnd

    0.0〜xまでの実数の乱数を発生する

    *戻り値
        double: 発生した乱数
    *引数
        double x:(入力) 発生する乱数の最大値
    *補足
        特になし
*/
double real_rnd(double x)

    return x/RAND_MAX*rand();


/*
    メイン
*/
int main(int argc, char *argv[])

    double n;
    int i;

    /* 入力チェック */
    if (argc < 2) {
        printf(”error\n”);
        return EXIT_FAILURE;
    }

    n = atof(argv[1]);  /* 第1パラメータ,乱数最大値 */
    if (n < 0) {
        printf(”error\n”);
        return EXIT_FAILURE;
    }

    /* 乱数種を設定 */
    /* 毎回異なる乱数を発生させるためにtime()を種に */
    srand(time(NULL));

    /* 乱数を10個発生 */
    /* 関数版 */
    for (i=0;i<9;i++) {
        printf(”%f ”, real_rnd(n));
    }
    printf(”\n”);

    /* マクロ版 */
    for (i=0;i<9;i++) {
        printf(”%f ”, REAL_RND(n));
    }
    printf(”\n”);

    return EXIT_SUCCESS;


People Who Wowed This Post

単位乱数

thread
/*
    単位乱数のサンプルプログラムです。

rand()の値をRAND_MAX+1で割ることにより、
0.0〜1.0までの乱数を発生させます。


*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* マクロ */
#define UNIT_RND() (rand()/(RAND_MAX+1.0))

/*
    unit_rnd

    0.0〜1.0までの乱数を発生する

    *戻り値
        double: 発生した乱数(0≦戻り値<1)
    *引数
        void
    *補足
        特になし
*/
double unit_rnd(void)

    return rand()/(RAND_MAX+1.0);


/*
    メイン
*/
int main(int argc, char *argv[])

    int i;

    /* 乱数種を設定 */
    /* 毎回異なる乱数を発生させるためにtime()を種に */
    srand(time(NULL));

    /* 乱数を10個発生 */
    /* 関数版 */
    for (i=0;i<9;i++) {
        printf(”%f ”, unit_rnd());
    }
    printf(”\n”);

    /* マクロ版 */
    for (i=0;i<9;i++) {
        printf(”%f ”, UNIT_RND());
    }
    printf(”\n”);

    return EXIT_SUCCESS;


People Who Wowed This Post

ある範囲内の整数乱数を発生させる

thread
/*
    ある範囲内の整数乱数を発生させるサンプルプログラムです。
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*
    int_rnd

    x1〜x2までの乱数を発生する

    *戻り値
        int: 発生した乱数
    *引数
        int x1:(入力) 発生する乱数の最小値
        int x2:(入力) 発生する乱数の最大値
    *補足
        特になし
*/
int int_rnd(int x1, int x2)

    int tmp;

    if (x2 < x1) {
        tmp = x1;
        x1 = x2;
        x2 = tmp;
    } 

    return rand() % (x2 − x1 + 1) + x1;


/*
    メイン
*/
int main(int argc, char *argv[])

    int start;
    int end;
    int i;

    /* 入力チェック */
    if (argc < 3) {
        printf(”error\n”);
        return EXIT_FAILURE;
    }

    start = atoi(argv[1]);  /* 第1パラメータ,開始値 */
    end = atoi(argv[2]);    /* 第2パラメータ,終了値 */

    /* 乱数種を設定 */
    /* 毎回異なる乱数を発生させるためにtime()を種に */
    srand(time(NULL));

    /* 開始値から終了値までの乱数を10個発生 */
    for (i=0;i<9;i++) {
        printf(”%d ”, int_rnd(start, end));
    }
    printf(”\n”);

    return EXIT_SUCCESS;


People Who Wowed This Post

0〜任意の数の乱数発生

thread
/*
    0〜任意の数の乱数発生サンプルプログラム

0〜任意の数までの間の整数の乱数を発生させるためには
rand()の値を(任意の数+1)で割り、余りを求めます。

*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* マクロ */
#define RND(x) (rand()%(x+1))

/*
    rnd

    0〜xまでの乱数を発生する

    *戻り値
        int: 発生した乱数
    *引数
        int x:(入力) 発生する乱数の最大値(0〜RAND_MAX)
    *補足
        特になし
*/
int rnd(int x)

    return rand() % (x+1);


/*
    メイン
*/
int main(int argc, char *argv[])

    int n;
    int i;

    /* 入力チェック */
    if (argc < 2) {
        printf(”error\n”);
        return EXIT_FAILURE;
    }

    n = atoi(argv[1]);  /* 第1パラメータ,乱数最大値 */
    if (n < 0) {
        printf(”error\n”);
        return EXIT_FAILURE;
    }

    /* 乱数種を設定 */
    /* 毎回異なる乱数を発生させるためにtime()を種に */
    srand(time(NULL));

    /* 乱数を10個発生 */
    /* 関数版 */
    for (i=0;i<9;i++) {
        printf(”%d ”, rnd(n));
    }
    printf(”\n”);

    /* マクロ版 */
    for (i=0;i<9;i++) {
        printf(”%d ”, RND(n));
    }
    printf(”\n”);

    return EXIT_SUCCESS;






People Who Wowed This Post

  • If you are a bloguru member, please login.
    Login
  • If you are not a bloguru member, you may request a free account here:
    Request Account