我无法意识到以下两个示例之间的区别:
var numbers = ['one', 'two', 'three'];
示例1:
console.log(numbers[Math.floor(Math.random() * numbers.length - 1) + 1])
示例2:
console.log(numbers[Math.floor(Math.random() * numbers.length)])
答案 0 :(得分:1)
以下是快速细分,以及尝试理解此类问题时应如何推理:
Math.random() -> outputs number in the [0, 1) range (0 <= x < 1)
names.length = 3
Math.floor() -> rounds down or removes any trailing decimals (0.9 -> 0, 1.245 -> 1)
将以上内容替换为您的代码,第一个示例numbers
索引变为:
console.log(numbers[Math.floor(Math.random() * numbers.length - 1) + 1])
-> Math.floor((0 <= x < 1) * 3 - 1) + 1
-> Math.floor((0 <= x < 3) - 1) + 1
-> Math.floor(-1 <= x < 2) + 1
-> { -1, 0, 1 } + 1
Possible indices are of the set { 0, 1, 2 }
第二个示例:
console.log(numbers[Math.floor(Math.random() * numbers.length)])
-> Math.floor((0 <= x < 1) * 3)
-> Math.floor(0 <= x < 3)
Possible indices are of the set { 0, 1, 2 }
两个输出都相同。
这两种算法均得出相同的可能索引,均适用于选择随机数组值。显然,更简单的解决方案更好。
将来对类似的问题使用类似的过程。