繁体   English   中英

如何使用Excel依次生成一系列随机分布的数字

[英]How to generate a series of randomly distributed numbers in sequence using Excel

我有一个号码,通常想分配到15个垃圾箱或单元格中。 我希望15个数字按顺序排列

例:

分配数量-340输出:6 9 12 16 20 24 27 30 32 32 32 32 30 27 24 20

...是的,我的系列作品发行不完善,但目前我正在这样做,

  • 首先创建数字1 2 3 4 ... 14 15的线性系列
  • 然后使用Norm.Dist(x,mean,standard_dev)生成一系列z得分值,其中x = 1,2,3 .. 14,15
  • 然后我使用相似的三角形缩放那些值。 x1 / y1 = x2 / y2,其中x1 = z分数; y1 = sum(z分数); x2 =我想要的数字; y2 = 340

有一个更好的方法吗? 因为我必须为此生成多个矩阵,但有些不正确...

这是一种命中方法,它搜索独立正态变量的随机向量,这些向量的和在目标和的给定公差内,并且如果是,则对所有数字进行重新缩放以使其精确等于和:

Function RandNorm(mu As Double, sigma As Double) As Double
    'assumes that Ranomize has been called
    Dim r As Double
    r = Rnd()
    Do While r = 0
        r = Rnd()
    Loop
    RandNorm = Application.WorksheetFunction.Norm_Inv(r, mu, sigma)
End Function

Function RandSemiNormVect(target As Double, n As Long, mu As Double, sigma As Double, Optional tol As Double = 1) As Variant
    Dim sum As Double
    Dim rescale As Double
    Dim v As Variant
    Dim i As Long, j As Long

    Randomize
    ReDim v(1 To n)
    For j = 1 To 10000 'for safety -- can increase if wanted
        sum = 0
        For i = 1 To n
            v(i) = RandNorm(mu, sigma)
            sum = sum + v(i)
        Next i
        If Abs(sum - target) < tol Then
            rescale = target / sum
            For i = 1 To n
                v(i) = rescale * v(i)
            Next i
            RandSemiNormVect = v
            Exit Function
        End If
    Next j
    RandSemiNormVect = CVErr(xlErrValue)
End Function

像这样测试:

Sub test()
    On Error Resume Next
    Range("A1:A15").Value = Application.WorksheetFunction.Transpose(RandSemiNormVect(340, 15, 20, 3))
    If Err.Number > 0 Then MsgBox "No Solution Found"
End Sub

具有这些参数的典型输出:

在此处输入图片说明

另一方面,如果将标准偏差更改为1,则只会得到一条消息,即找不到解决方案,因为在目标总和的指定公差范围内获得解决方案的可能性很小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM