【问题标题】:Random Number Generation to Memory from a Distribution using VBA使用 VBA 从分布中生成随机数到内存
【发布时间】:2013-01-29 18:44:54
【问题描述】:

我想从 VBA (Excel 2007) 中的选定分布中生成随机数。 我目前正在使用带有以下代码的分析工具包:

     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 中执行此操作。任何帮助深表感谢!谢谢!

【问题讨论】:

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


    【解决方案1】:

    使用内置函数是关键。除了泊松之外,这些函数中的每一个都有相应的版本。在我提出的解决方案中,我使用 Knuth 提出的算法从泊松分布中生成一个随机数。

    对于离散或模式,您显然必须编写自定义算法。

    关于种子,您可以在填充数组之前放置一个 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
    

    【讨论】:

      【解决方案2】:

      为什么不使用内置函数?

      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
      

      【讨论】:

      • 我认为这种方法行不通。例如,WorksheetFunction.poisson 不会生成泊松随机变量。
      猜你喜欢
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 2017-12-28
      • 2020-01-04
      • 2017-05-10
      • 2016-01-06
      相关资源
      最近更新 更多