4

VBA(Excel 2007)で選択した分布から乱数を生成したい。現在、次のコードでAnalysisToolpakを使用しています。

     Application.Run "ATPVBAEN.XLAM!Random", "", A, B, C, D, E, F

どこ

A = how many variables that are to be randomly generated 
B = number of random numbers generated per variable 
C = number corresponding to a distribution
         1= Uniform
         2= Normal
         3= Bernoulli
         4= Binomial
         5= Poisson
         6= Patterned
         7= Discrete 
D = random number seed
E = parameter of distribution (mu, lambda, etc.) depends on choice for C
(F) = additional parameter of distribution (sigma, etc.) depends on choice for C

しかし、私は乱数をシートではなく配列に生成させたいと思っています。ここで、は乱数を出力する場所を示していることは理解してい""ますが、乱数を配列や、シートではなく他の形式のメモリストレージに割り当てるための構文がわかりません。

このAnalysisToolpakサイトで説明されている構文に従ってみましたが、成功しませんでした。

VBAは乱数を生成するのに理想的な場所ではないことを認識していますが、VBAでこれを行う必要があります。どんな助けでも大歓迎です!ありがとう!

4

2 に答える 2

4

組み込み関数を使用することが重要です。これらの関数のそれぞれに対応するバージョンがありますが、ポアソンです。提示されたソリューションでは、クヌースによって提示されたアルゴリズムを使用して、ポアソン分布から乱数を生成しています。

DiscreteまたはPatternedの場合、明らかにカスタムアルゴリズムを作成する必要があります。

シードに関しては、配列を埋める前にランダム化[シード]を配置できます。

Function RandomNumber(distribution As Integer, Optional param1 = 0, Optional param2 = 0)

    Select Case distribution
    Case 1 'Uniform
        RandomNumber = Rnd()
    Case 2 'Normal
        RandomNumber = Application.WorksheetFunction.NormInv(Rnd(), param1, param2)
    Case 3 'Bernoulli
        RandomNumber = IIf(Rnd() > param1, 1, 0)
    Case 4 'Binomial
        RandomNumber = Application.WorksheetFunction.Binom_Inv(param1, param2, Rnd())
    Case 5 'Poisson
        RandomNumber = RandomPoisson(param1)
    Case 6 'Patterned
        RandomNumber = 0
    Case 7 'Discrete
        RandomNumber = 0
    End Select

End Function

Function RandomPoisson(ByVal lambda As Integer)   'Algorithm by Knuth

    l = Exp(-lambda)
    k = 0
    p = 1

    Do
         k = k + 1
         p = p * Rnd()
    Loop While p > l

    RandomPoisson = k - 1

End Function
于 2013-01-29T20:14:11.780 に答える
0

組み込み関数を使ってみませんか?

  1. ユニフォーム=rnd
  2. 通常=WorksheetFunction.NormInv
  3. ベルヌーイ=iif(rnd()<p,0,1)
  4. 二項=WorksheetFunction.Binomdist
  5. ポアソン=WorksheetFunction.poisson
  6. パターン化=for ... next
  7. ディスクリート=

-

select case rnd()
    case <0.1
       'choice 1
    case 0.1 to 0.4
       'choice 2
    case >0.4
       'choice 3
end select
于 2013-01-29T19:32:27.260 に答える