首页 > 技术文章 > 360技术笔试编程题

frank-link 2019-03-01 15:12 原文

题目描述

为考验各自的数学能力,小B和小A经常在一起玩各种数值游戏,这一次他们又有了一种新玩法。每人从指定的数值范围中各自选择一个整数,记小A选择的数值为a,小B选择的数值为b。他们用一个均匀分布的随机数发生器在该数值范围中随机生成一个整数c,定义制胜的游戏规则为谁选的数离c近则谁取得胜利。由于小B是女生,特别定义当两人的数与c之间的差值相等时,小B获胜。

由于先前的游戏中,小A为表现绅士风度总是输多赢少,因此他特别渴望这次能够给小B比较深刻的映像,所以向你求助。你事先已经知道了小B所选的数值和指定的数值范围,小A希望你帮他选择一个数值使得他获胜的概率最大。

输入多行,每行一组数据,包含两个正整数n和b,分别代表数值范围和小B所需的数字,其中 1 <= b <= n <= 10^9.
每组输入,单独的行中输出一个数,为小A所选的数字,使得小A获胜的概率最大,若存在多个这样的数,输出最小的那个。

 

直接上js代码,可以直接复制到控制台运行,思路解释都在注释里面了:

/**
 * 选数字游戏执行函数
 * @param {Number} n 玩游戏的次数
 */
function playGame(n) {
  let x = n;
  if (typeof n !== 'number' || parseInt(n) !== n) {
    console.warn("请输入整数局的对局次数");
    return false;
  }

  let aWin = 0;
  while (x > 0) {
    let winner = aMustWin();
    if (winner === 'a') {
      aWin++
    }
    x--
  }

  console.log(`
  共进行游戏${n}场
  小A获胜${aWin}场
  小A的胜率为${aWin / n *100}%
  `)
}

function aMustWin() {
  //生成n
  let n = Math.floor(Math.random() * Math.pow(10, 9));
  while (n === 0) {
    n = Math.floor(Math.random() * Math.pow(10, 9));
  }

  //按规则随机生成c - c不可能为0
  let c = Math.floor(Math.random() * n);
  while (c === 0) {
    c = Math.floor(Math.random() * n);
  }

  //小B的选择 - b不可能等于0
  let b = Math.floor(Math.random() * n);
  while (b === 0) {
    b = Math.floor(Math.random() * n);
  }

  //小A的选择 - 选择靠近小B的选择,并在靠近中值的一侧
  let a = 0,
    mid = parseInt((n + 1) / 2);
  if (mid > b) {
    a = b + 1
  } else {
    a = b - 1
  }

  //比较谁离C近
  if (Math.abs(c - b) <= Math.abs(c - a)) {
    console.log(`
    数值范围为1 - ${n}
    随机值c为 - ${c}
    小A的选择为 - ${a}
    小B的选择为 - ${b}
    小B获胜
    `)
    return 'b'
  } else {
    console.log(`
    数值范围为1 - ${n}
    随机值c为 - ${c}
    小A的选择为 - ${a}
    小B的选择为 - ${b}
    小A获胜
    `)
    return 'a'
  }
}
playGame(1000) //玩一千把

 

推荐阅读