Keyword: 多項分布, 整数疑似乱数ベクトル
概要
本サンプルは多項分布から整数疑似乱数ベクトルの生成を行うC言語によるサンプルプログラムです。 本サンプルは確率が以下で表される多項分布(この場合、k=4, m=6000, p1=0.08, p2=0.1, p3=0.8, p4=0.02)から20個の4次元の整数疑似乱数を生成し出力します。
※本サンプルはnAG Cライブラリに含まれる関数 nag_rand_gen_multinomial() のExampleコードです。本サンプル及び関数の詳細情報は nag_rand_gen_multinomial のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
出力結果
(本関数の詳細はnag_rand_gen_multinomial のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
この出力例をダウンロード |
nag_rand_gen_multinomial (g05tgc) Example Program Results 468 603 4811 118 490 630 4761 119 482 575 4821 122 495 591 4826 88 512 611 4761 116 474 601 4800 125 485 595 4791 129 468 582 4825 125 485 598 4800 117 485 573 4814 128 501 634 4749 116 482 618 4780 120 470 584 4810 136 479 642 4750 129 476 608 4807 109 473 631 4782 114 509 596 4778 117 450 565 4877 108 484 556 4840 120 466 615 4802 117
- 3~22行目に生成された整数疑似乱数が出力されています。
ソースコード
(本関数の詳細はnag_rand_gen_multinomial のマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
このソースコードをダウンロード |
/* nag_rand_gen_multinomial (g05tgc) Example Program. * * CLL6I261D/CLL6I261DL Version. * * Copyright 2017 Numerical Algorithms Group. * * Mark 26.1, 2017. */ /* Pre-processor includes */ #include <stdio.h> #include <math.h> #include <nag.h> #include <nag_stdlib.h> #include <nagg05.h> #define X(I, J) x[(order == Nag_ColMajor)?(J*pdx + I):(I*pdx + J)] int main(void) { /* Integer scalar and array declarations */ Integer exit_status = 0; Integer lr, x_size, i, j, lstate, pdx; Integer *state = 0, *x = 0; /* nAG structures */ NagError fail; Nag_ModeRNG mode; /* Double scalar and array declarations */ double p_max; double *r = 0; /* Set the distribution parameters */ Integer k = 4; Integer m = 6000; double p[] = { 0.08e0, 0.1e0, 0.8e0, 0.02e0 }; /* Set the sample size */ Integer n = 20; /* Return the results in column major order */ Nag_OrderType order = Nag_ColMajor; /* Choose the base generator */ Nag_BaseRNG genid = Nag_Basic; Integer subid = 0; /* Set the seed */ Integer seed[] = { 1762543 }; Integer lseed = 1; /* Initialize the error structure */ INIT_FAIL(fail); printf("nag_rand_gen_multinomial (g05tgc) Example Program Results\n\n"); /* Get the length of the state array */ lstate = -1; nag_rand_init_repeatable(genid, subid, seed, lseed, state, &lstate, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_rand_init_repeatable (g05kfc).\n%s\n", fail.message); exit_status = 1; goto END; } pdx = (order == Nag_ColMajor) ? n : k; x_size = (order == Nag_ColMajor) ? pdx * k : pdx * n; /* Calculate the size of the reference vector */ p_max = 0.0; for (i = 1; i < k; i++) p_max = (p_max < p[i]) ? p[i] : p_max; lr = 30 + 20 * sqrt(m * p_max * (1 - p_max)); /* Allocate arrays */ if (!(r = nAG_ALLOC(lr, double)) || !(state = nAG_ALLOC(lstate, Integer)) || !(x = nAG_ALLOC(x_size, Integer))) { printf("Allocation failure\n"); exit_status = -1; goto END; } /* Initialize the generator to a repeatable sequence */ nag_rand_init_repeatable(genid, subid, seed, lseed, state, &lstate, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_rand_init_repeatable (g05kfc).\n%s\n", fail.message); exit_status = 1; goto END; } /* Generate the variates, initializing the reference vector at the same time */ mode = Nag_InitializeAndGenerate; nag_rand_gen_multinomial(order, mode, n, m, k, p, r, lr, state, x, pdx, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_rand_gen_multinomial (g05tgc).\n%s\n", fail.message); exit_status = 1; goto END; } /* Display the variates */ for (i = 0; i < n; i++) { for (j = 0; j < k; j++) printf("%12ld", X(i, j)); printf("\n"); } END: nAG_FREE(r); nAG_FREE(state); nAG_FREE(x); return exit_status; }