说话的几率是多少?

Posted

技术标签:

【中文标题】说话的几率是多少?【英文标题】:Percentage chance of saying something? 【发布时间】:2012-07-18 03:00:14 【问题描述】:

我想写一个程序:

80% 的时间会说sendMessage("hi"); 5% 的时间会说sendMessage("bye"); 15% 的时间会说sendMessage("Test");

它与Math.random() 有关系吗? 喜欢

if (Math.random() * 100 < 80) 
  sendMessage("hi");

else if (Math.random() * 100 < 5) 
  sendMessage("bye");

【问题讨论】:

hmmm ... 加起来是 145%。 这是可能的,如果你把它看成他有三个机会说什么或什么都不说;一次 90%、一次 50% 和一次 5% 这绝对不是不可能的,它就像一个滚动添加,为某些广告提供更高的优先级,你可以做一个数组,其中有 100 个项目,40 个是 a,30 个是 b,30 个是c ,然后随机选择一个,而不是 90%、50% 和 5% - 重新思考你的数学 @Tom:就像这样,它可以说“hi bye test”吗?该代码使用else if,而不是简单的if,所以我怀疑这是一个真正的选择,但仍然很好。 现在它不再显示 145%,以下建议调用 random 一次并使用结果的解决方案将是实现此目的的方法。 【参考方案1】:

是的,Math.random() 是实现这一目标的绝佳方式。你要做的是计算一个随机数,然后根据它做出决定:

var d = Math.random();
if (d < 0.5)
    // 50% chance of being here
else if (d < 0.7)
    // 20% chance of being here
else
    // 30% chance of being here

这样你就不会错过任何可能性。

【讨论】:

关键是你应该生成和使用一个随机数。 @user2537537 -- 第一行声明(并定义)了一个 Java 双精度浮点变量;这只是声明变量的正确 Java 语法。 等等,不应该是“ @DysanixOfficial 不是 49%——更像是 49.999999999...,正如任何数学家都可以告诉你的那样,几乎是 50%。但可以肯定 -- @DysanixOfficial 它应该是 【参考方案2】:

对于这样的情况,通常最好生成 一个 随机数并根据该单个数字选择情况,如下所示:

int foo = Math.random() * 100;
if (foo < 80) // 0-79
    sendMessage("hi");
else if (foo < 85) // 80-84
    sendMessage("bye");
else // 85-99
    sendMessage("test");

【讨论】:

【参考方案3】:

我通过创建一个池并使用 Fisher yates shuffle 算法来获得一个完全随机的机会,从而创建了一个百分比机会函数。下面的 sn-p 测试了 20 次机会随机性。

var arrayShuffle = function(array) 
   for ( var i = 0, length = array.length, swap = 0, temp = ''; i < length; i++ ) 
      swap        = Math.floor(Math.random() * (i + 1));
      temp        = array[swap];
      array[swap] = array[i];
      array[i]    = temp;
   
   return array;
;

var percentageChance = function(values, chances) 
   for ( var i = 0, pool = []; i < chances.length; i++ ) 
      for ( var i2 = 0; i2 < chances[i]; i2++ ) 
         pool.push(i);
      
   
   return values[arrayShuffle(pool)['0']];
;

for ( var i = 0; i < 20; i++ ) 
   console.log(percentageChance(['hi', 'test', 'bye'], [80, 15, 5]));

【讨论】:

【参考方案4】:

我一直用我的不和谐机器人这样做

const a = Math.floor(Math.random() * 11);
    if (a >= 8)  // 20% chance
        /*
          CODE HERE
        */
     else  // 80% chance
        /*
          CODE HERE
        */
    

您可以根据需要将 11 更改为 101。

它有一个额外的原因是它执行 1 - 10 而不是 1 - 9(或 1 - 100 而不是 1 - 99)

【讨论】:

【参考方案5】:

产生 20% 的几率获得“Yupiii!”在 console.log 中

const testMyChance = () => 

  const chance = [1, 0, 0, 0, 0].sort(() => Math.random() - 0.5)[0]

  if(chance) console.log("Yupiii!")
  else console.log("Oh my Duck!")


testMyChance()

【讨论】:

【参考方案6】:

Java

/**
 * Zero or less returns 'false', 100 or greater returns 'true'. Else return probability with required percentage.
 * @param percentage for example 100%, 50%, 0%.
 * @return true or false with required probability.
 */
private static boolean probably(int percentage) 
    double zeroToOne = Math.random(); // greater than or equal to 0.0 and less than 1.0
    double multiple = zeroToOne * 100; // greater than or equal to 0.0 and less than 100.0
    return multiple < percentage;

javascript

function probably(percentage) 
  return Math.random() * 100 < percentage;

【讨论】:

【参考方案7】:

这里是这个问题的一个非常简单的近似解决方案。随机对一组真/假值进行排序,然后选择第一项。

这应该有三分之一的机会是真实的..

var a = [true, false, false]
a.sort(function() return Math.random() >= 0.5 ? 1 : -1 )[0]

【讨论】:

Array.prptotype.sort 可以使用相同的参数多次调用排序函数。如果您希望概率恰好是 1/3,则需要使您的排序函数具有幂等性。 @chris-browne 我确实说过这是一个“近似解决方案”,但我会进行修复,使其更接近 1/3。感谢您的意见。

以上是关于说话的几率是多少?的主要内容,如果未能解决你的问题,请参考以下文章

彩票双色球中奖的几率是多少?谁算过?

Math.random返回0的几率是多少?

中奖的概率是1%,则抽奖100次中奖的几率是多少

双色球中5个红号的几率是多少?

uniapp上架ios的几率多少

学会用数据说话-分布式锁究竟可以多少并发?