我想创建一个4个字母的长字符串,RANDOMLY包含字符串中的任何字母:“ROYGBV”.
我做的是这样的:
function generateSolution(){
var colors = "ROYGBV";
var str = "";
for (var i=0; i<4; i++) {
var loc = Math.ceil( Math.random()*colors.length );
str += colors.charAt(loc);
}
return str;
}
但这似乎不对,为什么会这样?
另外,这是来自练习的解决方案:
str += colors.charAt((Math.random() * 6) | 0);
我在我的解决方案中使用Math.ceil来防止随机浮动,如4.333123等.这个解决方案如何工作,而不会使randomed数字四舍五入?
另外,什么是|操作符意味着以及第二种解决方案中的随机化如何实际起作用?
解决方法:
|是bitwise OR operator.由于JavaScript中的按位运算仅适用于32位整数,这是将数字四舍五入为0的简便方法.在您的情况下,它等效于:
colors.charAt(Math.floor((Math.random() * 6)));
这个数字需要被覆盖而不是向上舍入,就像你目前使用ceil一样,否则你会错过数组的第一个元素(在索引0处).
以下是从the spec转换为整数的完整详细信息:
The production A : A @ B, where @ is one of the bitwise operators in the productions above, is evaluated as follows:
- Let lref be the result of evaluating A.
- Let lval be GetValue(lref).
- Let rref be the result of evaluating B.
- Let rval be GetValue(rref).
- Let lnum be ToInt32(lval).
- Let rnum be ToInt32(rval).
- Return the result of applying the bitwise operator @ to lnum and rnum. The result is a signed 32 bit integer.