Javascript 正在尝试改进浏览器中的Math.random()
我想在这方面寻求一些专家的建议,我的密码学知识充其量只是粗略的 我想知道这是否是生成加密安全随机数的可行解决方案。更具体地说,我想知道使用Math.abs()或Math.sin()钳制数字是否会减少我从crypto.getRandomValues获得的数字的随机性,以至于它不再用于加密Javascript 正在尝试改进浏览器中的Math.random(),javascript,security,encryption,cryptography,Javascript,Security,Encryption,Cryptography,我想在这方面寻求一些专家的建议,我的密码学知识充其量只是粗略的 我想知道这是否是生成加密安全随机数的可行解决方案。更具体地说,我想知道使用Math.abs()或Math.sin()钳制数字是否会减少我从crypto.getRandomValues获得的数字的随机性,以至于它不再用于加密 if(window.crypto&&window.crypto.getRandomValues){ Math.random=()=>{ var阵列=新的UINT32阵列(1) window.crypto.ge
if(window.crypto&&window.crypto.getRandomValues){
Math.random=()=>{
var阵列=新的UINT32阵列(1)
window.crypto.getRandomValues(数组)
返回Math.abs(Math.sin(数组[0]))
}
}
console.log(Math.random())
您试图通过“钳制”数字来实现什么?你的目标是一致的随机性吗?你不能通过取均匀随机变量的sin
得到它| sin(x)|
大于0.707
的时间超过50%。您没有减少熵,但正在将分布更改为非均匀分布。以下是对JSFIDLE的更新,它演示了您的分布:。您没有失去任何随机性,但您将获得更多接近1
的数字,而不是接近0
@Paulpro这一数学的本机实现。random返回0到1之间的数字。只是试图保持一致性以避免破坏东西。所以你想要一致的随机性?getRandomValues随机统一返回所有可能的值,因此只需除以最大UInt32+1:返回数组[0]/(2**32)
。谢谢,太好了。我没有进行基准测试,但我确信它也快了一些。