抽凭模板3.7-新增随机数复现
目录
审计抽凭模板作为一个抽样工具,也有很几年没更新了。
同事有需求需要将产生的随机数能够再次复现,应该也是为了证明抽样的随机性。
这里以随机单据抽样为例:
抽样结果复现
比如从 1-2000 个单据编号,我们从中抽取 10 个。
点击“单据抽样”,弹出“是否使用已有随机种子生成”,
我们点击“否”:

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

同时在C14 单元格会留存随机种子。
只要有了这个随机种子,以及参数不变,后面我们就可以复现出了。

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

代码
当然这个工具也还有其它一些抽样功能:
- PPS 抽样
- 分层抽样
- 属性统计抽样-凭证抽样
- 属性统计抽样-单据抽样
- 抽样结果合并与反写
如果会点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