Percentage chance of saying something?

前端 未结 5 1126
自闭症患者
自闭症患者 2021-01-30 05:09

How do I make it so ..

  • 80% of the time it will say sendMessage(\"hi\");
  • 5 % of the time it will say sendMessage(\"bye\");
  • <
相关标签:
5条回答
  • 2021-01-30 05:37

    Generate a 20% chance to get "Yupiii!" in the cancel.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()
    
    0 讨论(0)
  • 2021-01-30 05:39

    I made a percentage chance function by creating a pool and using the fisher yates shuffle algorithm for a completely random chance. The snippet below tests the chance randomness 20 times.

    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]));
    }

    0 讨论(0)
  • 2021-01-30 05:39

    Here is a very simple approximate solution to the problem. Sort an array of true/false values randomly and then pick the first item.

    This should give a 1 in 3 chance of being true..

    var a = [true, false, false]
    a.sort(function(){ return Math.random() >= 0.5 ? 1 : -1 })[0]
    
    0 讨论(0)
  • 2021-01-30 05:54

    For cases like this it is usually best to generate one random number and select the case based on that single number, like so:

    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");
    
    0 讨论(0)
  • 2021-01-30 06:00

    Yes, Math.random() is an excellent way to accomplish this. What you want to do is compute a single random number, and then make decisions based on that:

    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
    

    That way you don't miss any possibilities.

    0 讨论(0)
提交回复
热议问题