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 随机正数或负数的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 可以输入负数、正数、小数(小数保留一位)。

如何对表示数字(正数和负数以及小数部分)的字符串数组进行排序?

如何从js中的字符串中提取每个整数或浮点数(正数或负数)

如何在不使用 if 或 for 的情况下找到一个数字是正数、负数还是零? [复制]

javascript之常用正则表达式

替换除正数/负数外的所有内容