美文网首页
1、踢猴子

1、踢猴子

作者: 杀破狼real | 来源:发表于2018-01-12 19:11 被阅读0次

    一定数量的猴子围成一圈,以某个猴子开始从1号顺序编号。两个骰子随机掷出一个数,从1号开始数,数到骰子数的猴子出局,从下一个猴子继续从1开始数,再次数到骰子数的猴子出局,以此类推,最后剩下一个猴子。计算每个猴子成为最后被剩下的概率?可同时计算多个猴子数的不同概率。

    const calcNumPR = (count = 2) => (...monkeys) => monkeys.reduce((origin, item) => {
    
      // 生成指定个数的数字集合 [1, 2, 3]
      const originNumbers = [...new Array(item)].map((item, i) => i + 1);
    
      // 最后剩下号码集合
      let lastNumbers = [];
    
      // 默认2(count)个骰子,共 11(count * 6 - 1)种情况(2、3、4、5、6、7、8、9、10、11、12)
      for (let i = count; i <= count * 6; i++) {
    
        // 每次获取全新集合
        const currentNumbers = Object.assign([], originNumbers);
    
        // 默认去除位置为 -1,step 基数为当前变量
        let [pos, step] = [-1, i];
    
        for (let j = 0; j < currentNumbers.length; j++) {
    
          // 计算需要去除号码的位置
          pos += step;
    
          // 如果号码位置超过当前剩余数,则再从头开始数
          while (pos > currentNumbers.length - 1) {
            pos -= currentNumbers.length;
          }
    
          // 如果不是最后一个,则根据取出位置删除剩余元素,之后当前位置-1,当前循环变量-1
          if (currentNumbers.length > 1) {
            currentNumbers.splice(pos, 1);
            pos--;
            j--;
          }
    
        }
    
        // 将每个骰子最后剩余号码加入到集合中
        lastNumbers = [...lastNumbers, ...currentNumbers];
    
      }
    
      // 计算剩余号码集合中每个数字在11次机会重的概率
      origin[item] = originNumbers.map(originNumber => {
        const targetNumbers = lastNumbers.filter(lastNumber => lastNumber == originNumber);
        return {[originNumber]: targetNumbers.length ? (targetNumbers.length / 11 * 100).toFixed(2) + '%' : 0};
      });
    
      return origin;
    
    }, {});
    
    const numbers = calcNumPR(1)(6, 8);
    
    console.log(numbers);
    // {
    //   '6': [
    //     {'1': '18.18%'},
    //     {'2': 0},
    //     {'3': 0},
    //     {'4': '9.09%'},
    //     {'5': '18.18%'},
    //     {'6': '9.09%'},
    //   ],
    //   '8': [
    //     {'1': '18.18%'},
    //     {'2': 0},
    //     {'3': '9.09%'},
    //     {'4': 0},
    //     {'5': 0},
    //     {'6': '9.09%'},
    //     {'7': '9.09%'},
    //     {'8': '9.09%'},
    //   ],
    // };
    

    以上为代码演示,欢迎指正!

    相关文章

      网友评论

          本文标题:1、踢猴子

          本文链接:https://www.haomeiwen.com/subject/wwzfoxtx.html