为了账号安全,请及时绑定邮箱和手机立即绑定

扔 n 个骰子,向上面的数字之和为 S。给定 Given n,请列出所有可能的 S 值及其相应的概率。

扔 n 个骰子,向上面的数字之和为 S。给定 Given n,请列出所有可能的 S 值及其相应的概率。

互换的青春 2019-05-25 17:12:29
算法题,网上给出的解释感觉有点抽象。不知道有哪位能够帮忙详解一下,不甚感谢!附上搜索到解答:http://www.7zhang.com/index/c...http://www.cnblogs.com/bozhou...
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

$result=getResult(2);
var_dump($result);
/**
*[getResultdescription]
*@param[type]$n[骰子个数]
*@return[array][数组,点数和=>相应概率]
*/
functiongetResult($n){
//定义骰子的点数及其概率
$sixArr=array(
1=>1/6,
2=>1/6,
3=>1/6,
4=>1/6,
5=>1/6,
6=>1/6,
);
if($n==1){//只有一个骰子的情况
return$sixArr;
}else{//多个骰子情况
$result=$sixArr;
//假定结果是由一个骰子和其他任意个骰子的组合成的结果集
//当有N个骰子的时候,需要组合N-1次
for($i=0;$i<$n-1;$i++){
$result=getDiffArrResult($result,$sixArr);
}
}
return$result;
}
/**
*[getDiffArrResult将2个点数概率的数组进行组合,获取这2个数组组合而成的数字和及其概率]
*@param[type]$arr1[第一个数组]
*@param[type]$arr2[第二个数组]
*@return[array][数组,点数和=>相应概率]
*/
functiongetDiffArrResult($arr1,$arr2){
$result=array();
foreach($arr1as$k1=>$v1){
foreach($arr2as$k2=>$v2){
if(!isset($result[$k1+$k2]))$result[$k1+$k2]=0;
$result[$k1+$k2]+=$v1*$v2;
}
}
return$result;
}
自己写的PHP版本。通过两重循环获取2个数组的键值(骰子点数)及其出现概率。并将其累加。即可获得结果
                            
查看完整回答
反对 回复 2019-05-25
?
HUX布斯

TA贡献1876条经验 获得超6个赞

借着C++的代码来回答一下,思路就是随着骰子数目的增加,下一组的概率可以由上一组生成:
/*-std=c++11*/
#include
#include
#definePmapstd::map
classDices{
public:
staticconstexprdoubleUNIT=1.0/6.0;
private:
Pmappossibles;
size_tcount=0;
voidcalcNext(){
if(this->possibles.empty()){
//初始状态
this->possibles={
{1,UNIT},{2,UNIT},{3,UNIT},
{4,UNIT},{5,UNIT},{6,UNIT}
};
}else{
PmapnewMap;
for(autoconst&it:this->possibles){
for(inti=1;i<=6;i++){
unsignedintnewSum=it.first+i;
autoaddtion=it.second*UNIT;
autosearch=newMap.find(newSum);
if(search!=newMap.end()){
search->second+=addtion;
}else{
newMap.insert(std::make_pair(newSum,addtion));
}
}
}
this->possibles=newMap;
}
}
public:
Dices(){}
voidcalc(size_tc){
count=c;
possibles=Pmap();
if(count==0)return;
for(inti=0;icalcNext();
}
}
voidprint(){
std::cout<<"allpossibilities:"<floatsum=0.0;
for(autoconst&it:this->possibles){
sum+=it.second;
std::cout<}
std::cout<<"total:"<}
};
intmain(intargc,char**args){
Dicesd=Dices();
d.calc(2);
d.print();
d.calc(12);
d.print();
return0;
}
                            
查看完整回答
反对 回复 2019-05-25
  • 2 回答
  • 0 关注
  • 1052 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号