我有一个混合批处理/ 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
函数一次之间存在重大统计差异,那么我全都听见了。
答案 0 :(得分:3)
JavaScript的内置随机数生成器随引擎实现而变化。如果不了解底层发电机就很难说出来。 %RANDOM%
也是如此 - 但它可能实现为linear congruential generator(LCG)。在网上搜索,你可以很容易地找到forum posts about %RANDOM%
,这也表明它是作为一个LCG实现的 - 一般来说 - 具有众所周知的不良统计特性。
现在的问题是Math.random()
是否表现更好?它也可以作为LCG,更新的实现(如Google V8,Microsoft Edge)实现,但是将其实现为xorshift的变体。如果您了解所使用的JavaScript引擎,则可以轻松找到生成器的类型,以便查找有关其统计质量的信息。
作为黄金标准,您还可以比较重度统计测试套件中的两个生成器,例如Diehard和TestU01,我认为这对于您的目的来说是一种过度杀伤。
作为最后的建议,如果我不得不在不知情的情况下在两者之间进行选择,我会使用JavaScript生成器。如果它是作为LCG实现的,那么它可能并不比%RANDOM%
差,
否则它会更好。
但是,嘿,你不必在两个可能不好的发电机之间做出选择:使用自定义发电机!检查this page,了解可以移植到JavaScript的简单,现代,高质量的生成器。