Vba Excel中的随机数数组

Vba Excel中的随机数数组,vba,excel,excel-formula,Vba,Excel,Excel Formula,如何使用RAND或randtween函数创建随机数数组 我试图在一个公式中模拟10卷六面模具(例如)的平均结果 我曾经尝试过以下方法,但它只创建一个随机数并重复它 =SUMPRODUCT((ROW(A1:A10)^0)*(INT(RAND()*6)+1))/10 这对你有用吗?每行有一个骰子编号。 在A1和B列中输入“抛出”的次数,将显示结果 In B1: =IF(A$1>=ROW(),RANDBETWEEN(1,6),"") 然后你就可以根据自己的需要来填充 UDF怎么样 Fu

如何使用
RAND
randtween
函数创建随机数数组

我试图在一个公式中模拟10卷六面模具(例如)的平均结果


我曾经尝试过以下方法,但它只创建一个随机数并重复它

=SUMPRODUCT((ROW(A1:A10)^0)*(INT(RAND()*6)+1))/10

这对你有用吗?每行有一个骰子编号。
在A1和B列中输入“抛出”的次数,将显示结果

In B1: 
=IF(A$1>=ROW(),RANDBETWEEN(1,6),"")
然后你就可以根据自己的需要来填充

UDF怎么样

Function Throws(c)
    If Range(c).Value > 0 Then
        For i = 1 To Range(c).Value
            Str1 = Str1 & "," & WorksheetFunction.RandBetween(1, 6)
        Next i
        Throws = Mid(Str1, 2)
    End If

End Function

您可以在任何单元格中输入抛出次数,并使用
=抛出(“单元格”)
将其激活。
它在一个单元格中返回抛出

编辑2:

即使它是一个数组,也不确定是否可以使用average

Function Throws(c) As Variant()
    Dim Str1 As Variant
    If Range(c).Value > 0 Then
        For i = 1 To Range(c).Value
            If i = 1 Then Str1 = WorksheetFunction.RandBetween(1, 6)
            Str1 = Str1 & "," & WorksheetFunction.RandBetween(1, 6)
        Next i
        Throws = Application.WorksheetFunction.Transpose(Array(Str1))
    End If

End Function

三种可能的解决办法:

1) 通过使用法线近似,您可以很好地模拟单个单元格中10个卷的平均值。在目标单元格中输入:

=ROUND(NORM.INV(RAND(),3.5,SQRT(35/(12*10))),1)
我明确地留下了10,以显示如果您想要改变转鼓的数量,您需要修改什么。事实上35是3.5*10是一个巧合,即使有100卷,数字35也会保持不变。如果与10不同,则可能需要调整舍入。对于10,的标准偏差约为0.54,将1和6与3.5的平均值相差约4.6个标准偏差。平均而言,该公式将为您提供一个超出范围1-6 1的值(每270000次)。10卷骰子平均值的直方图形成了一条相当不错的钟形曲线,所以这种方法当然是合理的,并且可能适合您的目的

2) VBA sub,用精确的电子表格公式填充选定的单元格,使您无需繁琐的计数。如果要求最终电子表格不含宏,则仍可在开发阶段使用:

Sub DiceAverageFormula()
    'places a formula in the selected cell (or cells)
    'which simulates the average of rolling a die n 10 times

    Dim i As Long, n As Long
    Dim form As String

    n = InputBox("How many times do you want to roll?", "Dice", 10)
    If n < 1 Then Exit Sub
    form = "=Average(Randbetween(1,6)"
    For i = 2 To n
        form = form & ",Randbetween(1,6)"
    Next i
    form = form & ")"
    Selection.Formula = form
End Sub
为了测试各种方法,我用每种方法填充了30行,并对结果做了5个数字的总结(看起来很合理):

不用说,在这个屏幕截图中,法线近似值的平均值低于其他两个值这一事实并不特别相关。在统计测试能够检测到第一列和其他两列之间的任何差异之前,您需要进行大量的运行

编辑时:这是一张精确概率与普通近似值的图表,该图表示10卷普通模具的平均值。它强调了在这里使用中心极限定理是多么合理。尽管n=10是一个较小的样本量,但准确的概率足够对称和单峰,因此看起来已经相当正常:


函数可以处理数组输入。所以

=RANDBETWEEN(ROW(1:10)^0,6)
有效地创造:

=RANDBETWEEN({1;1;1;1;1;1;1;1;1;1},{6;6;6;6;6;6;6;6;6;6})
它返回一个由10个介于1和6之间的不同随机数组成的数组。通过将
A1:A10
更改为
A1:A100
,可以很容易地将其更改为100个(或任意多个)随机数。


因此,10个单独骰子卷的平均值的单一公式可以是:

=SUMPRODUCT(RANDBETWEEN(ROW(A1:A10)^0,6)/10
或等效的CSE公式

{=AVERAGE(RANDBETWEEN(ROW(A1:A10)^0,6))}

我能想到的问题的唯一直接答案是定义一个名为(比如)randeval的命名范围,并在其定义中使用隐藏的求值函数:-

 =EVALUATE(REPT("+RANDBETWEEN(1,6)",Sheet1!A1))
在A1中输入10,在A2中输入以下内容:-

=randeval/a1

每次按Ctrl-Alt-F9键时,它都会生成十个掷骰子平均值的新估计值。

我曾尝试在VBA中执行类似操作,但Evaluate的行为与Excel公式不太一样:

a = [randbetween(row(1:10)^0,6)]                ' 3

b = [transpose(randbetween(row(1:10)^0,6))]     ' {3,3,6,4,6,4,2,5,1,2}

c = [average(randbetween(row(1:10)^0,6))]       ' 2.9

具体的问题是如何将所有这些都整合到一个公式中——你能写出一个数组公式来返回多个不同的随机数吗?我不是在寻找VBA解决方案,尽管这里有它作为参考是很好的。您是否可以更新代码以返回一个随机数数组,以便使用
average
或类似方法找到平均值?@CallumDA33请立即尝试。您所说的平均结果是什么意思?投掷动作是:1,2,6,6。平均值为3.75,但最常见的是6。你想要哪个?我在寻找平均值,应该是3.5-这只是一个例子。我对函数更感兴趣我真的很喜欢这个答案-正态分布的使用很吸引人!我发现了另一种使用工作表函数的替代方法,您可能会发现它很有趣,很聪明!我甚至不确定这是否可能。我不知道Randbeth接受数组输入。这在我正在进行的模拟中会很方便。@eshwar,是的,我不知道
RANDBETWEEN
也能做到这一点。CallumDA33的回答很好。如果
randbween()
RAND()!
a = [randbetween(row(1:10)^0,6)]                ' 3

b = [transpose(randbetween(row(1:10)^0,6))]     ' {3,3,6,4,6,4,2,5,1,2}

c = [average(randbetween(row(1:10)^0,6))]       ' 2.9