我的猜测是问题出在您的randnum
方法上:
function rand(min, max){
return (Math.floor(Math.random() * (max - min + 1)) + min).toFixed(0);
}
我相信这会给你一个范围内的价值[min, max]
——包括两端。(实际上,它会为您提供该值的字符串版本作为toFixed
返回字符串,但是当您稍后使用它时,它会被强制转换为数字。)
现在你这样称呼它:
num = rand(1,chamarr.length);
因此,如果数组的长度为 6 个元素,您将获得 range 中的值[1, 6]
。但是随后您将尝试采用chamarr[num]
- 有效索引的范围是[0, 5]
因为数组是基于 0 的。如果您尝试使用元素 6,那将给您undefined
- 但是在元素 6 处拼接将无济于事。
我会将您的rand
方法更改为在上限处独占,如下所示:
function rand(min, max) {
return (Math.floor(Math.random() * (max - min)) + min).toFixed(0);
}
然后这样称呼它:
num = rand(0, chamarr.length);
这将为索引和拼接提供正确范围内的值。
编辑:回应评论等:
可能值得删除该功能的toFixed(0)
一部分rand
;毕竟,你并不真正想要一个字符串。这实际上并不是以前错误的一部分,但它通常更干净:
function rand(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
您可能还需要一个使0
下限隐式的函数版本
- 如果您不打算在代码中的其他任何地方使用随机数,您可以内联
Math.floor()
/Math.random()
调用而不是使用单独的函数,但我个人希望让它们远离只想得到的“逻辑”代码一个随机数并使用它。
- 我改变这个函数的原因是,在计算机科学中拥有一个独占的上限更为常见——它通常与集合之类的 0 索引一起使用。您通常会编写
for
包含下限和互斥下限等的循环。