目录

抽凭模板3.7-新增随机数复现

审计抽凭模板作为一个抽样工具,也有很几年没更新了。

同事有需求需要将产生的随机数能够再次复现,应该也是为了证明抽样的随机性。

这里以随机单据抽样为例:

抽样结果复现

比如从 1-2000 个单据编号,我们从中抽取 10 个。

点击“单据抽样”,弹出“是否使用已有随机种子生成”,

我们点击“否”:

会在左侧横排列示和右侧竖排列式选取的样本。

同时在C14 单元格会留存随机种子。

只要有了这个随机种子,以及参数不变,后面我们就可以复现出了。

只要我们点击“单据抽样”再次生成时,点击“是”,就可以复现。

代码

当然这个工具也还有其它一些抽样功能:

  1. PPS 抽样
  2. 分层抽样
  3. 属性统计抽样-凭证抽样
  4. 属性统计抽样-单据抽样
  5. 抽样结果合并与反写

如果会点VBA 可以自己修改。

VBA 密码: tujiabing81

由于 VBA 中并没有特别方便的随机种子与随机数对应的方法。

这里主要用到了 Rnd() 函数:

通过传入小于0的数字,找到首次随机的种子和随机数,再从这个随机数序列开始往下调用。

利用这个特性,如果给定随机种子 seed 就用 Rnd(-seed) 复现随机数。

如果没有给定随机种子就根据当前时间生成一个 seed 传入 Rnd(-seed) 生成随机数,并记录这个种子。

这个种子只用于首次随机,它就像在一个长长的随机序列中定位到一个点,后面的随机只是在这个点后面的排列。

因此,可以记录一个随机种子,能复现一个随机序列。

Function GenerateSeed() As Long
    ' 获取当前时间的小数部分,乘以 1000 以增加精度
    Dim currentTime As Double
    currentTime = Timer * 1000

    ' 将时间值四舍五入为整数,作为种子值
    GenerateSeed = Round(currentTime, 0)
End Function

Function MyRandom(Optional ByVal seed As Long = -1) As Variant
    Dim randomSeed As Long
    Dim randomNumber As Double

    ' 检查传入参数是否为Long类型
    If Not IsNumeric(seed) Then
        MsgBox "随机数种子不是正整数,请修改或选择‘是否使用已有随机数’时选择否", vbExclamation, "错误"
        Exit Function
    End If

    If seed <> -1 Then
        randomSeed = seed
    Else
        randomSeed = GenerateSeed()
    End If

    ' 使用指定的种子值调用 Rnd 函数生成随机数
    randomNumber = Rnd(-randomSeed)

    MyRandom = Array(randomSeed, randomNumber)
End Function

Sub test()
Dim result As Variant
Dim seed As Long

' 指定种子
seed = 56551340
result = MyRandom(seed)
Debug.Print "种子:" & result(0) & ",随机数:" & result(1)
' 或者不指定种子
'result = MyRandom()
'Debug.Print "种子:" & result(0) & ",随机数:" & result(1)
Debug.Print Rnd
Debug.Print Rnd
Debug.Print Rnd
Debug.Print Rnd
End Sub

下载方式

在审计军火库:https://www.auditdog.cn/posts/readme/ 中,打开 tools for auditor -> 05-抽凭模板

后续更新方式如上述所示。

更方便的下载方式(该链接后续可能不会更新):

百度网盘

链接: https://pan.baidu.com/s/1zbIiQ1hOwJb1YXSVOB1pUg?pwd=nigo 提取码: nigo