【问题标题】:JavaScript Random Positive or Negative NumberJavaScript 随机正数或负数
【发布时间】:2012-01-26 13:32:21
【问题描述】:

我需要创建一个随机的 -1 或 1 来乘以一个已经存在的数字。问题是我当前的随机函数生成 -1、0 或 1。最有效的方法是什么?

【问题讨论】:

    标签: javascript random


    【解决方案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];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多