我的功能名为DicePlot,模拟滚动10个骰子5000次。在该函数中,它计算每个卷的10个骰子的值的总和,其将是1×5000向量,并且绘制具有边缘的相对频率直方图,以相同的方式选择,其中直方图中的每个仓应该表示骰子总和的可能值。
计算1×5000骰子值之和的平均值和标准偏差,并绘制在相对频率直方图之上的正态分布的概率密度函数(具有计算的平均值和标准偏差)。
我已经完成了所有工作,但我对如何绘制概率密度函数感到困惑。任何帮助表示赞赏。谢谢!
作为参考,该图应该看起来像!
function DicePlot ( throw_num, die_num )
throw_num=5000
die_num= 10
throws = rand ( throw_num, die_num );
throws = ceil ( 6 * throws );
for i = die_num : die_num*6
j = find ( score == i );
y(i-die_num+1) = length ( j ) / throw_num;
end
bar ( x, y )
xlabel ( 'Score' )
ylabel ( 'Estimated Probability' )
score_ave = sum ( score(1:throw_num) ) / throw_num;
score_var = var ( score );
return
end
答案 0 :(得分:2)
我已经从我对your previous question的回答添加到代码中,在直方图的顶部绘制了缩放的高斯pdf。两个关键的增加如下:1)使用hold on
和hold off
来获得直方图并绘制在同一图上。 2)将normpdf
的输出缩放到适当的大小,使其与直方图的比例相同。
另外一件事,我不禁注意到你还没有把我之前回答的建议纳入你的功能。有什么特别的原因吗?我当然不会为你的问题+1,除非我能看到证据证明你已经将过去的建议纳入了你的工作中!现在你走了,让我听起来像我的高中老师! : - )
%#Define the parameters
NumDice = 2;
NumFace = 6;
NumRoll = 500;
%#Generate the rolls and obtain the sum of the rolls
AllRoll = randi(NumFace, NumRoll, NumDice);
SumRoll = sum(AllRoll, 2);
%#Determine the bins for the histogram
Bins = (NumDice:NumFace * NumDice)';
%#Build the histogram
hist(SumRoll, Bins);
title(sprintf('Histogram generated from %d rolls of %d %d-sided dice', NumRoll, NumDice, NumFace));
xlabel(sprintf('Sum of %d dice', NumDice));
ylabel('Count');
hold on
%#Obtain the mean and standard deviation of the data
Mu = mean(SumRoll);
Sigma = sqrt(var(SumRoll));
%#Obtain the Gaussian function using 4 standard deviations on either side of Mu
LB = Mu - 4 * Sigma; UB = Mu + 4 * Sigma;
Partition = (LB:(UB - LB) / 100:UB)';
GaussianData = normpdf(Partition, Mu, Sigma);
%#Scale the Gaussian data so the size matches that of the histogram
GaussianData = NumRoll * GaussianData;
%Plot the Gaussian data
plot(Partition, GaussianData, '-r');
hold off
ps,如果您不知道先验直方图应该是高斯(由于中心极限定理),那么您也可以使用统计工具箱中的ksdensity
来使用核函数得到经验密度。