以下示例之间的差异(随机数)

时间:2018-10-26 15:25:48

标签: javascript

我无法意识到以下两个示例之间的区别:

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)])

1 个答案:

答案 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 }

两个输出都相同。

这两种算法均得出相同的可能索引,均适用于选择随机数组值。显然,更简单的解决方案更好。

将来对类似的问题使用类似的过程。