%RANDOM%和Math.random()之间的差异在随机性方面

时间:2017-05-25 03:21:36

标签: batch-file random jscript wsh

我有一个混合批处理/ jscript文件(使用cscript),它必须从文本文件中随机选择一个引号。因此,我需要一些RNG来调用足够随机的结果,以便在会话之间不要重复通知。

我们都知道%RANDOM%并不是那么好,但我注意到连续多次执行%RANDOM%(在同一个会话中)会产生更令人满意的结果。

这是真的还是我最好使用下面的JScript?

function getRandomNumber(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

WScript.echo(getRandomNumber(0, 32767));

如果 在调用%RANDOM%两次与调用getRandomNumber函数一次之间存在重大统计差异,那么我全都听见了。

1 个答案:

答案 0 :(得分:3)

JavaScript的内置随机数生成器随引擎实现而变化。如果不了解底层发电机就很难说出来。 %RANDOM%也是如此 - 但它可能实现为linear congruential generator(LCG)。在网上搜索,你可以很容易地找到forum posts about %RANDOM%,这也表明它是作为一个LCG实现的 - 一般来说 - 具有众所周知的不良统计特性。

现在的问题是Math.random()是否表现更好?它也可以作为LCG,更新的实现(如Google V8,Microsoft Edge)实现,但是将其实现为xorshift的变体。如果您了解所使用的JavaScript引擎,则可以轻松找到生成器的类型,以便查找有关其统计质量的信息。

作为黄金标准,您还可以比较重度统计测试套件中的两个生成器,例如DiehardTestU01,我认为这对于您的目的来说是一种过度杀伤。

作为最后的建议,如果我不得不在不知情的情况下在两者之间进行选择,我会使用JavaScript生成器。如果它是作为LCG实现的,那么它可能并不比%RANDOM%差, 否则它会更好。

但是,嘿,你不必在两个可能不好的发电机之间做出选择:使用自定义发电机!检查this page,了解可以移植到JavaScript的简单,现代,高质量的生成器。