Javascript 从math random更改为window.crypto
我使用了一个随机字生成器,我想将其从Javascript 从math random更改为window.crypto,javascript,html,arrays,Javascript,Html,Arrays,我使用了一个随机字生成器,我想将其从math.random更改为更安全的window.crypto 我花了几个小时试图让它工作,我确信代码中有错误。我必须如何更改代码才能使用window.crypto方法将此代码设置为 var-wordings=['X', “我”, “二” ]; 函数getRandom(随机数组){ 返回Math.floor(Math.random()*randArray.length); } 函数showrandom(){ document.getElementById('r
math.random
更改为更安全的window.crypto
我花了几个小时试图让它工作,我确信代码中有错误。我必须如何更改代码才能使用window.crypto
方法将此代码设置为
var-wordings=['X',
“我”,
“二”
];
函数getRandom(随机数组){
返回Math.floor(Math.random()*randArray.length);
}
函数showrandom(){
document.getElementById('random').innerHTML=wordings[getRandom(wordings)]+''+wordings[getRandom(wordings)];
}
showrandom();
到目前为止,我尝试的是:
var-wordings=['X',
“我”,
“二”
];
函数getRandom(随机数组){
var阵列=新的UINT32阵列(10);
window.crypto.getRandomValues(数组);
}
函数showrandom(){
document.getElementById('random').innerHTML=wordings[getRandom(wordings)]+''+wordings[getRandom(wordings)];
}
您缺少)
它应该是文档。getElementById('random')。innerHTML=words[getRandom(words)]+''+words[getRandom(words)]代码>这能解决您的问题吗
正如文档所示,此方法生成随机整数值。我从你们的代码中了解到,你们试图从随机数中导出wordings
数组中单词的索引。要从随机整数中获取索引,可以对每个随机数使用words.length
的模运算,但这种方法需要从安全性方面进行研究
代码如下所示:
var wordings = ['X',
'I',
'II'
];
function getRandom(randArray){
var cryptoObj = window.crypto || window.msCrypto; // for IE 11
var array = new Uint32Array(1);
cryptoObj.getRandomValues(array);
return array[0]%randArray.length;
}
function showrandom() {
document.getElementById('random').innerHTML = wordings[getRandom(wordings)] + ' ' + wordings[getRandom(wordings)];
}
基本问题是Math.random
返回从0(包括)到1(排除)的值,而window.crypto.getRandomValues
返回从0到最大32位整数的整数(或您传入的数组类型的最大值)
因此,您需要将window.crypto
的范围缩小到Math.random
差不多
函数cryptoRandom(){
//返回一个加密生成的数字
//介于0和1之间(包括0和1);
//在结果范围内模拟Math.random函数
var阵列=新的UINT32阵列(1),
max=Math.pow(2,32),//通常max是2^32-1,但是我们删除了-1
//所以最大值是唯一的
randomValue=window.crypto.getRandomValues(数组)[0]/max;
返回随机值;
}
函数getRandom(随机数组){
返回Math.floor(cryptoRandom()*randary.length);
}
查看为什么使用模%
会降低随机数的熵您可以添加一段您迄今为止尝试过的代码片段吗?嘿!我现在添加了代码。嘿,托尼克。丢失的)不是问题,但是代码解决了我的问题。我真的非常感谢您的帮助和文档链接。非常感谢!应该注意的是,模运算导致输出不完全一致(早期值比晚期值稍有可能)。使用uint32阵列
,即使Uint8Array
通常足以减少这种影响。对于大多数应用程序来说,这应该不是问题。