代码之家  ›  专栏  ›  技术社区  ›  Nick

Javascript-数学。随机改进

  •  0
  • Nick  · 技术社区  · 7 年前

    我目前正在做一个小游戏,需要返回1,2或3。

    var isMultipleOf, number1, number2, random;
    
    random = function(number) {
      return isMultipleOf(Math.floor((Math.random() * number) + 1));
    };
    
    isMultipleOf = function(number) {
      if (number % 2 === 0) {
        return 1;
      }
      if (number % 3 === 0) {
        return 2;
      } else {
        return 3;
      }
    };
    
    number1 = random((Math.random() * 100) + 1);
    number2 = random((Math.random() * 100) + 1);
    
    console.log("number 1 is " + number1 + " and number2 is " + number2);
    

    这段代码可以工作,但如果可能的话,我想对其进行一些改进。

    在我的比赛中,平局是可能的,但以我目前的逻辑,平局经常发生,我不喜欢这样。你能建议一个更好的方法来改善这一点,使其不太可能获得平局(相同的数字)?

    3 回复  |  直到 7 年前
        1
  •  1
  •   epascarello    7 年前

    isMultipleOf = function(number) {
      if (number % 2 === 0) {
        return 1;
      }
      if (number % 3 === 0) {
        return 2;
      } else {
        return 3;
      }
    };
    
    var results = [0,0,0];
    for (var i=1; i<=100; i ++ ){
       results[isMultipleOf(i)-1] += 1
    }
    
    console.log(results)
    Chance of 1: 50
    Chance of 2: 17
    Chance of 3: 33
    

    如果你想得到更好的结果,不要仅仅使用随机数,将其分为3部分。

    getNum = function(number) {
      if (number < .33) {
        return 1;
      }
      if (number < .67) {
        return 2;
      } else {
        return 3;
      }
    };
    
    var results = [0,0,0];
    for (var i=1; i<=100; i ++ ){
       var rn = Math.random()
       results[getNum(rn)-1] += 1
    }
    
    console.log(results)
        2
  •  1
  •   James    7 年前

    当前,您选择一个从1到100的随机数,选择另一个小于或等于第一个的随机数,然后如果第二个数是2的倍数,则返回1,如果是3的倍数,但不是2,则返回2,否则返回3。

    var rnd = Math.floor(Math.random() * 3) + 1;  // 1 2 or 3, with 1/3 probability
    

    另一种选择是从一个已知的池中抽取每个数字(如彩票),保证没有关系。

    //start with an ordered array
    var nums = [1,2,3];
    
    // fisher-yates shuffle
    for (var i=nums.length - 1; i > 0; i--) {
      var r = Math.floor(Math.random() * (i + 1));
      var tmp = nums[r];
      nums[r] = nums[i];
      nums[i] = tmp;
    }
    
    // any two elements can be our drawn numbers
    alert("first: " + nums[0] + ", second: " + nums[1]);
        3
  •  0
  •   Adrian Sawicki    7 年前