For Loop返回奇怪的长度

时间:2018-03-05 15:40:42

标签: javascript for-loop

我有这个javascript代码:

var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
  key = '',
  c;

for (i = 0; i < 32; i++) {
  c = Math.floor(Math.random() * chars.length + 1);
  key += chars.charAt(c)
}

console.log('return key length that needs to be 32...' + key.length);

我需要总是返回32键长度..但我随机:

return key length that needs to be 32...31
return key length that needs to be 32...29
return key length that needs to be 32...32
return key length that needs to be 32...31
return key length that needs to be 32...30
return key length that needs to be 32...32
return key length that needs to be 32...31

我知道错误在:i<32;但javascript会在我添加i=32;时冻结我尝试i<=32但结果相同......所以我知道这是基本问题,但我不知道t知道热返回总是32键长度?

4 个答案:

答案 0 :(得分:4)

问题在于此行中的+ 1

c = Math.floor(Math.random() * chars.length + 1);

有效索引从0运行到chars.length-1。上述作业会从1chars.length选择一个随机数。所以它忽略了字符串中的第一个字符,有时会尝试在字符串外部访问。在后一种情况下,chars.charAt(c)会返回undefined,并附加不会增加结果长度的内容。

&#13;
&#13;
var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
  key = '',
  c;

for (i = 0; i < 32; i++) {
  c = Math.floor(Math.random() * chars.length);
  key += chars.charAt(c)
}

console.log('return key length that needs to be 32...' + key.length);
&#13;
&#13;
&#13;

答案 1 :(得分:2)

问题在于Math.floor(Math.random() * chars.length + 1);

Math.random()返回0到1之间的数字,包括0和1。当它为1时,Math.floor(1 * 32 + 1)33 chars.charAt(33)undefined,但导致key没有添加任何内容,因此随机长度。

删除+ 1,它应该按预期工作。

答案 2 :(得分:1)

试试这个

  var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
        key   = '',
        c;

    for (i=0;i<32;i++) {
        c = Math.floor(Math.random()*chars.length);
        key += chars.charAt(c);
    }

    console.log('return key length that needs to be 32...'+key.length);

答案 3 :(得分:1)

有时math.random()返回这样的值(Math.random()* chars.length + 1)变为&gt; = 64。

Math.random()*char.length+1 >= 64
Math.random()*char.length >= 63
Math.random()* >= 63/64 (in our case)
Math.random() >= 0.984375

如果math.random返回值&gt; = 0.984375,则c将为64,因此密钥长度将小于32。 您无需添加1即可解决此问题。