额外增加数组打乱步骤能否提升随机选取数组元素的随机性?
结论
- 你可以直接删除数组打乱步骤,该步骤不会提升随机性,反而会带来不必要的性能开销,极端情况下还可能降低最终结果的随机性。
具体原因
- 随机选取的结果和数组初始顺序无关
你最终生成字符串的逻辑是「生成随机索引、取索引对应数组元素拼接」,只要Rnd生成的随机索引分布均匀,不管数组元素是按0-9顺序排列还是打乱后排列,每个数字被选中的概率都是1/10,最终生成的8位字符串的随机性没有任何差异。 - 额外的打乱步骤会浪费伪随机数资源
VBA的Rnd是伪随机数生成器,生成的随机序列质量是固定的,你打乱数组的过程额外调用了10次Rnd,相当于消耗了更多的伪随机序列状态,既没有带来收益,还额外增加了代码执行耗时。 - 你当前使用的打乱算法本身存在分布缺陷
你写的打乱逻辑不是标准的Fisher-Yates洗牌算法,这种遍历全数组随机交换的实现会导致元素排列的概率并不完全均等,反而有极大概率让最终随机结果的分布出现偏差,效果反而不如直接随机选取。
特殊场景说明
只有当你需要生成无重复数字的随机字符串时,打乱数组才有意义:你可以先打乱数组,再按顺序取前8位即可,这种实现比「随机选取后判断是否重复」的逻辑效率更高。但你当前的实现是允许数字重复的,因此完全不需要打乱步骤。
内容的提问来源于stack exchange,提问作者SpaghettiCode
相关产品推荐
相关产品推荐

