題目:甲有4個骰子,乙有3個骰子,乙搖出的骰子點(diǎn)數(shù)之和大于甲搖出的點(diǎn)數(shù)之和的概率是多少
分析
這是一道數(shù)學(xué)上的排列問題,計算機(jī)可以把所有情況都枚舉出來,格式[A,A,A,A,B,B,B],一共6^7種可能,看其中哪些滿足條件。
每個骰子點(diǎn)數(shù)是1-6,甲的擲出的點(diǎn)數(shù)和范圍是4-24,乙擲出的點(diǎn)數(shù)和范圍是3-18,例如甲擲出的4的時候,乙必須比甲大,所以乙的范圍是5-18,以此類推

alt 甲乙之間的關(guān)系
先給大家展示個有問題的方法,看大家有沒看出什么問題,也是我找了一個晚上才找出問題所在
js
const util={};
//加下來用jia來表示甲的和點(diǎn)數(shù),yi來表示乙的和點(diǎn)數(shù)
//滿足條件的可能性方法
util.getAllPro=(jia)=>{
//一個哨兵變量用來保存當(dāng)甲總和數(shù)為jia的時候總的可能性數(shù)量
let total=0;
//甲的總和確定了,乙的總和必須比jia大,所以乙的總和在大于等于jia+1到小于等于18之間
for(let i=jia+1;i<=18;i++){
total+=util.getYiPro(i);
}
//當(dāng)甲的總和數(shù)為jia的時候的可能情況總和
return util.getjiaPro(jia)*total;
}
//乙的總和數(shù)為yi的時候的可能性數(shù)量
util.getYiPro=(yi)=>{
//原理見圖2
return util.addNum(yi-2);
}

alt 乙總數(shù)的得到原理
util.getjiaPro=(jia)=>{
//原理見圖3
return util.addaddNum(jia-3);
}

alt 甲總數(shù)的得到原理
//求1+2+3+...+n
//尾遞歸
util.addNum=(n,total=0)=>{
if(n===0){
return total;
}
total+=n;
return util.addNum(n-1,total)
}
//3維的時候
util.addaddNum=(n,total=0)=>{
for(var i=0;i<n+1;i++){
total+=util.addNum(i);
}
return total;
}
let allprotime=0;
//甲的范圍從4-17
for(let jiaNum=4;jiaNum<18;jiaNum++){
allprotime+=util.getAllPro(jiaNum);
}
console.log('滿足條件的可能性',allprotime); //滿足條件的可能性 900048
console.log('所有的可能性',Math.pow(6,7)); //所有的可能性 279936
等到的結(jié)果中
滿足條件的可能性>所有的可能性
所以計算方式有問題
乙為18的時候這個的組合只有一種情況,而util.addNum(18)就不是了,是因為,乙的每個骰子的數(shù)字不會大于6,這就導(dǎo)致了util.addNum計算不正確
我想到正確的解法
但是增加了空間復(fù)雜度,也增加了時間復(fù)雜度
//乙的總和數(shù)為yi的時候的可能性數(shù)量
util.getYiPro = (yi, total = 0) => {
for (let i = 1; i <= 6; i++) {
for (let j = 1; j <= 6; j++) {
for (let k = 1; k <= 6; k++) {
if (i + j + k === yi) {
total += 1;
}
}
}
}
return total;
}
util.getjiaPro = (jia, total = 0) => {
for (let i = 1; i <= 6; i++) {
for (let j = 1; j <= 6; j++) {
for (let k = 1; k <= 6; k++) {
for (let d = 1; d <= 6; d++) {
if (i + j + k + d === jia) {
total += 1;
}
}
}
}
}
return total;
}
因為甲的4個骰子和乙的3個骰子其實可以動態(tài)變化的,這里暫時不繼續(xù)了
如果有什么好的,方法,來解決這個問題,歡迎來告知