Excel生成规范化数据

时间:2011-01-08 08:02:16

标签: excel vba excel-vba random

我希望生成一些数据,其中给定两个平均值(平均点击次数)和(一次性平均点击次数)将正确输出间隔开的数据。

很难解释,但最好用一个例子。

鉴于以下数据:

Days: 10
Average Click Value: 3.5
Average Clicks over days: 0.7

然后您可以制作如下数据:

Day 1   
Day 2   
Day 3   4
Day 4   
Day 5   
Day 6   
Day 7   
Day 8   
Day 9   3
Day 10  

第9天(3)和第3天(4)之间的平均值为3.5,总平均值(7天超过10天)为0.7。


以下 NOT 可以正常工作,因为它的点击价值平均为3.5,但整体平均值为1.4:

Day 1   4
Day 2   
Day 3   3
Day 4   
Day 5   
Day 6   4
Day 7   
Day 8   
Day 9   3
Day 10  

以下 NOT 有效,因为它的总体平均值为0.7,但点击值为1.75:

Day 1   1
Day 2   
Day 3   2
Day 4   
Day 5   3
Day 6   
Day 7   
Day 8   
Day 9   1
Day 10  

点击值必须是整数,因此以下操作无效:

Day 1   
Day 2   
Day 3   3.5
Day 4   
Day 5   
Day 6   
Day 7   
Day 8   
Day 9   3.5
Day 10  

每个之间的间距应该是随机的,但要遵循严格的偏差。该模式应与用户访问其喜爱的网站的频率类似。

我理解它有时候不准确,因为某些组合不能用数学方法完成,但它应该尽可能接近它。

这种模式是否可以使用excel(可以使用VBA)。

2 个答案:

答案 0 :(得分:1)

这是一个入门阵列功能:您可以垂直输入:选择行数=到天数,输入功能并按Ctrl-Shift-Enter。 随机程度由变化常数控制。

Function ClickSpacer(nDays As Long, ClickAvg As Double, ClicksPerDay As Double)

    Dim Spacing As Long
    Dim Clicks() As Long        ''' output
    Dim Total_Clicks As Double
    Dim nDaysClicked As Double
    Dim j As Long
    Dim ClicksSoFar As Long
    Dim RandSpacing As Long
    Dim RandClicks As Long
    Dim ClickOffset As Long
    ReDim Clicks(1 To nDays, 1 To 1)
    Const Variation As Double = 0.2

    Total_Clicks = Round(nDays * ClicksPerDay, 0)
    nDaysClicked = Round(Total_Clicks / ClickAvg, 0)

    Spacing = nDays / (nDaysClicked + 1)
    RandSpacing = Round(Spacing * Variation, 0) * 2
    ClickOffset = Spacing + Round(Rnd() * RandSpacing, 0) - Round(Rnd() * RandSpacing, 0)
    RandClicks = ClickAvg * Variation * 2

    For j = 1 To nDaysClicked
        If j > 1 Then ClickOffset = ClickOffset + Spacing + Round(Rnd() * RandSpacing, 0) - Round(Rnd() * RandSpacing, 0)
        If j = nDaysClicked Then
            Clicks(ClickOffset, 1) = Round((Total_Clicks - ClicksSoFar) / (nDaysClicked - j + 1), 0)
        Else
            Clicks(ClickOffset, 1) = Round((Total_Clicks - ClicksSoFar) / (nDaysClicked - j + 1) + (RandClicks * Rnd() - RandClicks * Rnd()), 0)
        End If
        ClicksSoFar = ClicksSoFar + Clicks(ClickOffset, 1)
    Next j

    ClickSpacer = Clicks
End Function

答案 1 :(得分:0)

我认为您可以使用Solver轻松实现这一目标。制作一个你想要的模型,定义你的目标(2个平均值)作为公式,然后给它解决的数据范围。但是,你每次都可能得到相同的答案。试一试。
请注意,Solver是可选安装,如果您进行标准安装而不是完整安装,则可能不会显示。