我想从 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 中执行此操作。任何帮助深表感谢!谢谢!
最佳答案
使用内置功能是关键。除了泊松之外,这些函数中的每一个都有相应的版本。在我提出的解决方案中,我使用 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
关于vba - 使用 VBA 从分布中生成随机数到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589978/