使用VBA从分布生成随机数到内存

时间:2013-01-29 18:44:55

标签: vba excel-vba random excel-2007 data-analysis

我想从VBA中选定的发行版生成随机数(Excel 2007)。 我目前正在使用Analysis Toolpak,代码如下:

     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

但是我希望将随机数生成到数组中,而不是生成到工作表上。 我理解""指定应该打印随机数的位置,但我不知道将随机数分配给数组的语法,或者某种其他形式的内存存储而不是表单

我已尝试遵循此Analysis Toolpak site中讨论的语法,但没有成功。

我意识到VBA不是生成随机数的理想位置,但我需要在VBA中执行此操作。任何帮助深表感谢!谢谢!

2 个答案:

答案 0 :(得分:4)

使用内置功能是关键。每个函数都有相应的版本,但Poisson。在我提出的解决方案中,我使用Knuth提出的算法从泊松分布中生成随机数。

对于Discrete或Patterned,您显然必须编写自定义算法。

关于种子,您可以在填充数组之前放置 Randomize [seed]

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

答案 1 :(得分:0)

为什么不使用内置函数?

  1. Uniform = rnd
  2. 正常= WorksheetFunction.NormInv
  3. Bernoulli = iif(rnd()<p,0,1)
  4. 二项式= WorksheetFunction.Binomdist
  5. 泊松= WorksheetFunction.poisson
  6. 图案= for ... next
  7. Discrete =
  8. -

    select case rnd()
        case <0.1
           'choice 1
        case 0.1 to 0.4
           'choice 2
        case >0.4
           'choice 3
    end select