我想从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中执行此操作。任何帮助深表感谢!谢谢!
答案 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)
为什么不使用内置函数?
rnd
WorksheetFunction.NormInv
iif(rnd()<p,0,1)
WorksheetFunction.Binomdist
WorksheetFunction.poisson
for ... next
-
select case rnd()
case <0.1
'choice 1
case 0.1 to 0.4
'choice 2
case >0.4
'choice 3
end select