在下面的函数中,for循环有时会跳过一次迭代。
在一些罕见的情况下,我也发现它跳过了两次迭代。 如果我对for循环的理解仍然不完整,这有时会破坏我的代码,可能会影响我未来的代码。
我进一步研究了这个问题并尝试使用while循环,发现如果使用while循环,这个问题就不会发生。
为什么for循环有时会跳过一些迭代?
function forLoopString(len)
{
var string = 'abcdefghijklmnopqrstuvwxyz0123456789';
var character = '',
randomString = '';
for (var i = 0; i < len; i++)
{
character = string.charAt(Math.floor(Math.random() * string.length-1) + 0);
randomString += character;
}
if(randomString.length < len)
{
console.log('Less than required length!');
randomString = randomString + '5';
}
return randomString;
}
答案 0 :(得分:3)
显示的循环赢了&#34;跳过&#34;任何迭代,但会按照[0, len)
进行迭代。
然而,charAt
的否定论点使它看起来像是&#34;跳过&#34;因为"foo".charAt(-1) == ""
。对于String.charAt的任何越界,相同的空字符串结果成立:
.. 如果您提供给[charAt]的索引超出范围,JavaScript 将返回一个空字符串。
产生始终有效索引的更正只是Math.floor(Math.random() * string.length)
,没有 -1。
虽然这有点偏颇(对于任何真正关心的人),这是正确的&#39;因为Math.random返回范围[0, 1)
中的数字。因此Math.random() * len
会返回[0, len)
的值;在场后的同一区间内作为整数。
此外,最好选择更有用的变量名称..并且,正如Ed指出的那样+0是无关紧要的,因为Math.floor
返回一个(整数)数字。
答案 1 :(得分:1)
答案 2 :(得分:1)
你的问题在这里:
character = string.charAt(Math.floor(Math.random() * string.length-1) + 0);
如果您的兰特小于0,您将获得一个负数,因此,您将不会获得任何角色。你必须像这样封装你的string.length-1:
character = string.charAt(Math.floor(Math.random() * (string.length-1)));
更新了小提琴:DEMO
永远记住: MULTIPLICATIONS首先!!
编辑: string.length is 36
,您不需要将1减去它,只需乘以左
character = string.charAt(Math.floor(Math.random() * string.length));