JavaScript 随机正数或负数
Posted
技术标签:
【中文标题】JavaScript 随机正数或负数【英文标题】:JavaScript Random Positive or Negative Number 【发布时间】:2012-01-26 13:32:21 【问题描述】:我需要创建一个随机的 -1 或 1 来乘以一个已经存在的数字。问题是我当前的随机函数生成 -1、0 或 1。最有效的方法是什么?
【问题讨论】:
【参考方案1】:不要使用您现有的功能 - 只需调用 Math.random()
。如果
var plusOrMinus = Math.random() < 0.5 ? -1 : 1;
【讨论】:
完美运行,有趣的是我在网上的任何地方都找不到答案。【参考方案2】:我一直很喜欢
Math.round(Math.random()) * 2 - 1
因为这有点道理。
Math.round(Math.random())
会给你 0 或 1
将结果乘以 2 将得到 0 或 2
然后减去 1 得到 -1 或 1。
直观!
【讨论】:
在我看来,这是一个更好的“随机” - 或 + 创建者。选择的答案对我不起作用,因为如果我想要一个小于 4 且不是负数的数字怎么办?这只是一个更好的解决方案。 @Brendan - 虽然我同意这是一个更灵活的解决方案,但 OP 的要求专门用于需要返回“随机 -1 或 +1”。值得一提的是,这个解决方案虽然更灵活 - 也需要更多操作 - 就对Math.round
的额外调用、乘法和减法而言 - 与单个条件检查相比。【参考方案3】:
你为什么不试试:
(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...)【参考方案4】:
只是为了好玩:
var plusOrMinus = [-1,1][Math.random()*2|0];
或
var plusOrMinus = Math.random()*2|0 || -1;
但是使用你认为可以维护的东西。
【讨论】:
一方面,我应该说对于可读性有一些话要说。另一方面,从我的答案中剔除 3 个字符的荣誉(尽管我可以争辩说所有 3 个字符都是不必要的空格)。如果您还从0.5
中删除 0
,我的会短 1 个字符。 :-)【参考方案5】:
正如之前的答案所示,确实有很多方法可以做到这一点。
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() ) );
【讨论】:
【参考方案6】:我正在使用underscore.js shuffle
var plusOrMinus = _.shuffle([-1, 1])[0];
【讨论】:
以上是关于JavaScript 随机正数或负数的主要内容,如果未能解决你的问题,请参考以下文章
如何对表示数字(正数和负数以及小数部分)的字符串数组进行排序?