用matlab进行骰子模拟

时间:2016-02-10 14:35:23

标签: matlab

我是这个论坛的新人。首先,我发现拥有这样一个网站非常有趣,每个人都可以在不同的领域获得帮助。非常感谢你。

所以我有一个问题:我应该解决以下问题:

  • 模拟rand ntrials掷骰子。
  • 如果rand()中的[0, 1/6]则抛出1;
  • rand()中的(1/6, 2/6]然后抛出2
  • ...
  • 如果rand()中的(5/6, 1]则抛出了6。
  • 用hist生成ntrials结果的直方图。

这就是我所做的:

ntrials = 100;
X = abs(rand(1,ntrials)*6) + 1;
hist(floo(X))

现在我必须做第二次练习:

  • 投掷两个骰子,S是2个骰子的总和
  • 计算S分别接受2,3,4,5 ..... 12之一的概率。
  • 写一个Matlab函数twoTimesDice,通过模拟第一个练习中的2个骰子的投射,得出理论结果。

这就是我的尝试:

function twoTimesDice
  x1 = abs(rand(1,11))*6 + 1;
  s1 = floor(x1);      % probably result of the first dice
  x2 = abs(rand(1,11))*6 +1;
  s2 = floor(x2)       % probably result of de second dice
  S = s1 +s2;
  hist(S);
end

如果我做得好,你能告诉我吗?

2 个答案:

答案 0 :(得分:0)

对于第一部分,我会使用floor而不是abs,

X = floor(rand(1, ntrials)*6) + 1;

因为它返回您要查找的值,或者Daniel注释,请使用

randi(6)

返回一个整数。

然后你可以运行

hist(X,6)

对于第二部分,我相信他们要求两个骰子,每个都是1-6,而不是一个2-12。

x = floor(rand(1)*6) + 1;

分布看起来会有所不同。滚动那两次,添加结果,这是你的twoTimesDice函数。 滚动那个ntrials次,然后做一个直方图(就像你已经做的那样)。

我不确定rand()究竟是多么随机。

答案 1 :(得分:0)

生成1到6之间的骰子可以通过randi()完成。

首先,使用randi()代替floor()abs()

X = randi(6,1,ntrials)

将为您提供一个长度为ntrials的数组,其随机整数范围为1到6.(您需要1或者它将返回ntrials大小为ntrial的方阵)。 randi documentation

在该功能中,我个人的偏好是请求试验次数作为输入。

您的功能将变为:

function twoTimesDice(ntrials)
  s1 = randi(6,1,ntrials);      % result of the first dice
  s2 = randi(6,1,ntrials);      % result of the second dice
  S = s1 +s2;
  hist(S);
end

对于标准化的直方图,您可以将hist(S)替换为:

numOfBins = 11;
[histFreq, histXout] = hist(S, numOfBins);
figure;
bar(histXout, histFreq/sum(histFreq)*100);
xlabel('Value');ylabel('Percentage');

(如this question中所述)