我想创建一个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这样的随机浮动等等。这个解决方案如何工作,而不会使得数字变得圆滑?
此外,|
运算符是什么意思?以及第二种解决方案中的随机化如何实际起作用?
答案 0 :(得分:4)
|
是bitwise OR operator。由于JavaScript中的按位运算仅适用于32位整数,因此这是将数字四舍五入为0的简便方法。在您的情况下,它等同于:
colors.charAt(Math.floor((Math.random() * 6)));
的数量需要被地板而不是舍入,因为你当前与做ceil
,否则会错过阵列(其在索引0)的第一要素。
以下是从the spec转换为整数的完整详细信息:
生产A:A @ B,其中@是上述产品中的一个按位运算符,评估如下:
- 让 lref 成为评估 A 的结果。
- 让 lval 为GetValue( lref )。
- 让 rref 成为评估 B 的结果。
- 让 rval 为GetValue( rref )。
- 让 lnum 为ToInt32( lval )。
- 让 rnum 为ToInt32( rval )。
- 返回将按位运算符@应用于lnum和rnum的结果。结果是带符号的32位整数。
醇>
答案 1 :(得分:1)
您希望Math.floor()
代替Math.ceil()
。 Javascript数组从零开始,因此您需要0到5之间的值。
答案 2 :(得分:1)
试试这个
function generateSolution() {
var colors = "ROYGBV",
str = "",
l = colors.length,
i = 0;
while (i < 4) {
var loc = Math.floor(Math.random() * l);
str += colors.charAt(loc);
i += 1;
}
return str;
}
console.log(generateSolution());
上
你需要Math.floor,|只是执行32位底层的一种按位方法