专栏名称: 逆行的狗
不会编程的军人不是好的审计员
目录
相关文章推荐
51好读  ›  专栏  ›  逆行的狗

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

逆行的狗  · 公众号  ·  · 2024-06-05 23:04

正文

请到「今天看啥」查看全文


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

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

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

抽样结果复现

比如从 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

审计抽凭工具更新(抽凭模板3.5)

审计军火库迁移至audit dog网站







请到「今天看啥」查看全文