Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从math random更改为window.crypto_Javascript_Html_Arrays - Fatal编程技术网

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
通常足以减少这种影响。对于大多数应用程序来说,这应该不是问题。