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

Fortranによるサンプルソースコード : 使用ルーチン名:g05tgf

ホーム > 製品 > nAG数値計算ライブラリ > nAG Fortranライブラリ > サンプルソースコード集 > 多項分布から整数疑似乱数ベクトルを生成

Keyword: 多項分布, 整数疑似乱数ベクトル

概要

本サンプルは多項分布から整数疑似乱数ベクトルの生成を行うFortranによるサンプルプログラムです。 本サンプルは確率が以下で表される多項分布(この場合、k=4, m=6000, p1=0.08, p2=0.1, p3=0.8, p4=0.02)から20個の4次元の整数疑似乱数を生成し出力します。

多項分布のデータ 

※本サンプルはnAG Fortranライブラリに含まれるルーチン g05tgf() のExampleコードです。本サンプル及びルーチンの詳細情報は g05tgf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本ルーチンの詳細はg05tgf のマニュアルページを参照)
1
2
3
4
5

このデータをダウンロード
G05TGF Example Program Data
1  1  1762543     :: GENID,SUBID,SEED(1)
20                :: N
6000  4           :: M,K
0.08 0.1 0.8 0.02 :: P

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目に使用する生成器(genid=1:nAG基本生成器)、生成器に関する情報(subid=1:GENIDが1の場合この値は参照されません)、生成器の初期値(seed=1762543)を指定しています。
  • 3行目に生成される乱数の数(n=20)を指定しています。
  • 4行目に多項分布の試行回数(m=6000)と起こりうる結果の数(k=4)を指定しています。
  • 5行目に多項分布の起こりうる結果の確率(p)を指定しています。

出力結果

(本ルーチンの詳細はg05tgf のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

この出力例をダウンロード
 G05TGF Example Program Results

        1    2    3    4
  1   468  603 4811  118
  2   490  630 4761  119
  3   482  575 4821  122
  4   495  591 4826   88
  5   512  611 4761  116
  6   474  601 4800  125
  7   485  595 4791  129
  8   468  582 4825  125
  9   485  598 4800  117
 10   485  573 4814  128
 11   501  634 4749  116
 12   482  618 4780  120
 13   470  584 4810  136
 14   479  642 4750  129
 15   476  608 4807  109
 16   473  631 4782  114
 17   509  596 4778  117
 18   450  565 4877  108
 19   484  556 4840  120
 20   466  615 4802  117

  • 4~23行目に生成された整数疑似乱数が出力されています。

ソースコード

(本ルーチンの詳細はg05tgf のマニュアルページを参照)

※本サンプルソースコードは科学技術・統計計算ライブラリである「nAG Fortranライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法

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

このソースコードをダウンロード
    PROGRAM g05tgfe

!      G05TGF Example Program Text

!      Mark 23 Release. nAG Copyright 2011.

!      .. Use Statements ..
       USE nag_library, ONLY : g05kff, g05tgf, nag_wp, x04eaf
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       INTEGER, PARAMETER              :: lseed = 1, maxlr = 5000, nin = 5,    &
                                          nout = 6
!      .. Local Scalars ..
       REAL (KIND=nag_wp)              :: pmax
       INTEGER                         :: genid, ifail, k, ldx, lr, lstate, m, &
                                          mode, n, subid
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE :: p(:), r(:)
       INTEGER                         :: seed(lseed)
       INTEGER, ALLOCATABLE            :: state(:), x(:,:)
!      .. Intrinsic Functions ..
       INTRINSIC                          int, maxval, real, sqrt
!      .. Executable Statements ..
       WRITE (nout,*) 'G05TGF Example Program Results'
       WRITE (nout,*)
       FLUSH (nout)

!      Skip heading in data file
       READ (nin,*)

!      Read in the base generator information and seed
       READ (nin,*) genid, subid, seed(1)

!      Initial call to initialiser to get size of STATE array
       lstate = 0
       ALLOCATE (state(lstate))
       ifail = 0
       CALL g05kff(genid,subid,seed,lseed,state,lstate,ifail)

!      Reallocate STATE
       DEALLOCATE (state)
       ALLOCATE (state(lstate))

!      Initialize the generator to a repeatable sequence
       ifail = 0
       CALL g05kff(genid,subid,seed,lseed,state,lstate,ifail)

!      Read in sample size
       READ (nin,*) n

!      Read in the distribution parameters
       READ (nin,*) m, k

       ldx = n
       ALLOCATE (x(ldx,k),p(k))

!      Read in probabilities
       READ (nin,*) p(1:k)

!      Use suggested value for LR
       pmax = maxval(p(1:k))
       lr = int(3.0E1_nag_wp+2.0E1_nag_wp*sqrt(real(m, &
          kind=nag_wp)*pmax*(1.0E0_nag_wp-pmax)))

!      If R is a reasonable size use MODE = 2
!      else do not reference R and use MODE = 3
       IF (lr<maxlr) THEN
          mode = 2
       ELSE
          mode = 3
          lr = 0
       END IF

       ALLOCATE (r(lr))

!      Generate the variates
       ifail = 0
       CALL g05tgf(mode,n,m,k,p,r,lr,state,x,ldx,ifail)

!      Display the variates
       ifail = 0
       CALL x04eaf('General',' ',n,k,x,ldx,' ',ifail)

    END PROGRAM g05tgfe


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks