`
sunlujing
  • 浏览: 177934 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

面试题 抛骰子8次 和为多少的概率最大

阅读更多

一道笔试题,抛骰子8次,和为多少最大,对于笔试题可以这样考虑,两个骰子和为 7的概率最大,8次的话最大为28.

下面编程给出说明,result[i][j] 代表抛i次时,和为j 的次数。对于第i+1 次可使用前面的结果来计算,如计算 result[i+1][48] 可以 把result[i][48-1], result[i][48-2],result[i][48-3],result[i][48-4],result[i][48-5],result[i][48-6] 的值加起来,这样的话就可以自底向上的推出任意次抛骰子的和的结果。

算法如下:

 

public static void rollDice(int cnt){
		int result[][] = new int[cnt+1][cnt*6+1];
		result[1][1]=1;
		result[1][2]=1;
		result[1][3]=1;
		result[1][4]=1;
		result[1][5]=1;
		result[1][6]=1;
		for(int i=2; i <= cnt;i++){
		  for(int j=i;j<=i*6;j++){
			  for(int k=1;k<=6;k++){
				  if(k<j){
					  result[i][j] +=result[i-1][j-k];
				  }
			  }
		  }	
		}
		for(int i=cnt;i<=cnt*6;i++){
			System.out.println("sum "+i+"\tcnt: "+result[cnt][i]);
		}
		
	}
	
    public static void main(String[] args) {
		rollDice(8);
	}

//result
sum 8	cnt: 1
sum 9	cnt: 8
sum 10	cnt: 36
sum 11	cnt: 120
sum 12	cnt: 330
sum 13	cnt: 792
sum 14	cnt: 1708
sum 15	cnt: 3368
sum 16	cnt: 6147
sum 17	cnt: 10480
sum 18	cnt: 16808
sum 19	cnt: 25488
sum 20	cnt: 36688
sum 21	cnt: 50288
sum 22	cnt: 65808
sum 23	cnt: 82384
sum 24	cnt: 98813
sum 25	cnt: 113688
sum 26	cnt: 125588
sum 27	cnt: 133288
sum 28	cnt: 135954
sum 29	cnt: 133288
sum 30	cnt: 125588
sum 31	cnt: 113688
sum 32	cnt: 98813
sum 33	cnt: 82384
sum 34	cnt: 65808
sum 35	cnt: 50288
sum 36	cnt: 36688
sum 37	cnt: 25488
sum 38	cnt: 16808
sum 39	cnt: 10480
sum 40	cnt: 6147
sum 41	cnt: 3368
sum 42	cnt: 1708
sum 43	cnt: 792
sum 44	cnt: 330
sum 45	cnt: 120
sum 46	cnt: 36
sum 47	cnt: 8
sum 48	cnt: 1

 

1
2
分享到:
评论
8 楼 liurun_225 2013-06-09  
介题目是玩麻将的人出的么???

默认两个6面骰子么。。。唉。。。
7 楼 ansjsun 2013-06-03  
最大熵问题吧...期望
6 楼 sunlujing 2013-06-03  
yscyfy 写道
你学过概率论这问题很好算的啊,根本不是个程序的问题,就是个多维随机变量的概率分布的问题,  直接就能得到结果

大哥能不能给个公式啊,我数学不怎么行的~
5 楼 Alex丿 2013-06-02  
额,表情是参数8, OOP模拟环境
4 楼 Alex丿 2013-06-02  
package com.trial;

public class Dice {

private int min;
private int max;

public Dice(int min, int max) {
this.min = min;
this.max = max;
}

public int getMin() {
return min;
}

public int getMax() {
return max;
}

}
3 楼 Alex丿 2013-06-02  
package com.trial;

import java.util.HashMap;
import java.util.Map;

public class DiceTool {

/**
* 点数和与出现次数的映射
*/
private Map<Integer , Integer> timeMap;

/**
* 抛骰子
* @param dice
* @param time
* @return
*/
public  Map<Integer , Integer> cast(Dice dice, int time) {
timeMap = new HashMap<Integer, Integer>();
castSum(dice, 0, time);
return timeMap;
}

/**
* 每一轮的点数计数
* @param dice
* @param sum
* @param time
*/
public void castSum(Dice dice, int sum, int time) {
for (int i=dice.getMin(); i<=dice.getMax(); i++) {
if (time == 1) {
if (timeMap.get(sum + i) == null) {
timeMap.put(sum + i, 1);
} else {
timeMap.put(sum + i, timeMap.get(sum + i) + 1);
}
} else {
castSum(dice, sum + i, time - 1);
}
}
}

public static void main(String[] args) {
Dice dice = new Dice(1, 6);
Map<Integer, Integer> map = new DiceTool().cast(dice,;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "\t\t:" + entry.getValue());
}
}

}
2 楼 yscyfy 2013-06-02  
你学过概率论这问题很好算的啊,根本不是个程序的问题,就是个多维随机变量的概率分布的问题,  直接就能得到结果
1 楼 bro_feng 2013-06-02  
我觉得可以优化的,入参可以是n%6,因为骰子1-6的概率是相同的,所以8次的结果是(n/6 *(1+2+3+4+5+6)) + (n%6 和的最大值)

相关推荐

Global site tag (gtag.js) - Google Analytics