【发布时间】:2012-01-26 13:32:21
【问题描述】:
我需要创建一个随机的 -1 或 1 来乘以一个已经存在的数字。问题是我当前的随机函数生成 -1、0 或 1。最有效的方法是什么?
【问题讨论】:
标签: javascript random
我需要创建一个随机的 -1 或 1 来乘以一个已经存在的数字。问题是我当前的随机函数生成 -1、0 或 1。最有效的方法是什么?
【问题讨论】:
标签: javascript random
不要使用您现有的功能 - 只需调用 Math.random()。如果
var plusOrMinus = Math.random() < 0.5 ? -1 : 1;
【讨论】:
我一直很喜欢
Math.round(Math.random()) * 2 - 1
因为这有点道理。
Math.round(Math.random()) 会给你 0 或 1
将结果乘以 2 将得到 0 或 2
然后减去 1 得到 -1 或 1。
直观!
【讨论】:
Math.round 的额外调用、乘法和减法而言 - 与单个条件检查相比。
你为什么不试试:
(Math.random() - 0.5) * 2
50% 的机会产生负值,另外还有一个好处是仍然会生成随机数。
或者如果真的需要 -1/1:
Math.ceil((Math.random() - 0.5) * 2) < 1 ? -1 : 1;
【讨论】:
(Math.random() - 0.5) * 2 是我见过的最干净的方式
0.999... - 0.5 = 0.4999...,但0 - 0.5 = -0.5。 (因为 Math.random() 返回 0 到 0.999...)
只是为了好玩:
var plusOrMinus = [-1,1][Math.random()*2|0];
或
var plusOrMinus = Math.random()*2|0 || -1;
但是使用你认为可以维护的东西。
【讨论】:
0.5 中删除 0,我的会短 1 个字符。 :-)
正如之前的答案所示,确实有很多方法可以做到这一点。
Math.round() 和 Math.random 的最快组合:
// random_sign = -1 + 2 x (0 or 1);
random_sign = -1 + Math.round(Math.random()) * 2;
你也可以使用 Math.cos() (which is also fast):
// cos(0) = 1
// cos(PI) = -1
// random_sign = cos( PI x ( 0 or 1 ) );
random_sign = Math.cos( Math.PI * Math.round( Math.random() ) );
【讨论】:
var plusOrMinus = _.shuffle([-1, 1])[0];
【讨论】: