【发布时间】:2012-11-21 14:10:00
【问题描述】:
看起来 Math.random() 在 [0,1) 范围内生成一个 64 位浮点数,而新的 crypto.getRandomValues() API 只返回整数。使用此 API 在 [0,1) 中生成数字的理想方法是什么?
这似乎可行,但似乎不是最理想的:
ints = new Uint32Array(2)
window.crypto.getRandomValues(ints)
return ints[0] / 0xffffffff * ints[1] / 0xffffffff
编辑:澄清一下,我试图产生比 Math.random()更好的结果。根据我对浮点的理解,应该可以获得 52 位随机性的完全随机分数。 (?)
编辑 2:为了提供更多背景信息,我并没有尝试做任何加密安全的事情,但是有很多关于 Math.random() 实施不佳的轶事故事(例如 http://devoluk.com/google-chrome-math-random-issue.html)所以哪里有更好的有替代品我想用它。
【问题讨论】:
-
我在 Chrome 中试过你的代码,我也得到了值
> 1,例如2.5.... -
为什么是
Math.abs()?从我在 Chrome 中看到的情况来看,随机数是正数。 -
@ŠimeVidas 实际上,它们必须是正数,因为 OP 使用的是 Uint(无符号整数)缓冲区视图。
crypto.getRandomValues只是生成一个随机二进制缓冲区,无论使用何种视图,都会将其上下文化为数字。 -
@apsillers 我明白了。我尝试了
Int32Array,确实得到了负数。 -
为什么是这样的表达方式?不只是
ints[0] / 0xffffffff会产生一个随机的[0,1)值吗?
标签: javascript random