1. 程式人生 > >嘔心瀝血演算法題——古代賭局

嘔心瀝血演算法題——古代賭局

// 俗話說:十賭九輸。因為大多數賭局的背後都藏有陰謀。不過也不盡然,有些賭局背後藏有的是:“陽謀”。
// 有一種賭局是這樣的:桌子上放六個匣子,編號是1至6。多位參與者(以下稱玩家)可以把任意數量的錢押在某個編號的匣子上。
// 所有玩家都下注後,莊家同時擲出3個骰子(骰子上的數字都是1至6)。輸贏規則如下:
// 1. 若某一個骰子上的數字與玩家所押注的匣子號相同,則玩家拿回自己的押注,莊家按他押注的數目賠付(即1比1的賠率)。
// 2. 若有兩個骰子上的數字與玩家所押注的匣子號相同,則玩家拿回自己的押注,莊家按他押注的數目的2倍賠付(即1比2的賠率)。
// 3. 若三個骰子上的數字都與玩家所押注的匣子號相同,則玩家拿回自己的押注,莊家按他押注的數目的6倍賠付(即1比6的賠率)。
// 4. 若玩家所押注匣子號與某個骰子示數乘積等於另外兩個骰子示數的乘積,則玩家拿回自己的押注,莊家也不賠付(流局)。
// 5. 若以上規則有同時滿足者,玩家可以選擇對自己最有利的規則。規則執行後,則莊家收穫所有匣子上剩餘的押注。
// 乍一看起來,好像規則對玩家有利,莊家吃虧。但經過大量實戰,會發現局面很難說,於是懷疑是否莊家做了手腳,
// 莊家則十分爽快地說:可以由玩家提供骰子,甚至也可以由玩家來投擲骰子。
// 你的任務是:通過程式設計模擬該過程。模擬50萬次,假定只有1個玩家,他每次的押注都是1元錢,其押注的匣子號是隨機的。
// 再假定莊家有足夠的資金用於賠付。最後計算出莊家的盈率(莊家盈利金額/押注總金額)。

let yl = 0;          // 盈利
let count1 = 0;      // 莊家賠6
let count2 = 0;      // 莊家賠2
let count3 = 0;      // 莊家賠1
let count4 = 0;      // 莊家賠0
let count5 = 0;      // 莊家掙1

function yaosaizi() {
   let nums = [];
   nums[0] = parseInt(Math.random() * 6 + 1);
   nums[1] = parseInt(Math.random() * 6 + 1);
   nums[2] = parseInt(Math.random() * 6 + 1);
   return nums;
}

function check(nums, ya) {
   let count = 0;
   for (let i = 0; i < nums.length; i++) {
      if (nums[i] == ya) {
         count++;
      }
   }
   return count;
}

function check2(nums, ya) {
   if (ya * nums[0] == nums[1] * nums[2] || ya * nums[1] == nums[0] * nums[2] || ya * nums[2] == nums[1] * nums[0]) {
      return true;
   }
   return false;
}

function fun() {
   let xiazhu = 1;
   let ya = parseInt(Math.random() * 6 + 1);
   let nums = yaosaizi();
   if (check(nums, ya) == 3) {
      yl -= xiazhu * 6;
      count1++;
   } else if (check(nums, ya) == 2) {
      yl -= xiazhu * 2;
      count2++;
   } else if (check(nums, ya) == 1) {
      yl -= xiazhu * 1;
      count3++;
   } else if (check2(nums, ya)) {
      count4++;
   } else {
      yl += xiazhu;
      count5++;
   }
}

for (let i = 0; i < 500000; i++) {
   fun();
}
console.log(yl);
console.log(yl / 500000);