関連情報
ホーム > 製品 > NAG数値計算ライブラリ > サンプルソースコード集 > 多項分布から整数疑似乱数ベクトルを生成 (C言語/C++)

多項分布から整数疑似乱数ベクトルを生成

C言語によるサンプルソースコード
使用関数名:nag_rand_gen_multinomial (g05tgc)

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 のマニュアルページを参照)

この出力例をダウンロード
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等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法


このソースコードをダウンロード
/* 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;
}


Results matter. Trust NAG.

Privacy Policy | Trademarks