# Roll a 6-Sided Die and Compute the Probability of the Sum (with bar graph)

45 views (last 30 days)
Sophie Culhane on 27 Oct 2020
Answered: Steven Lord on 27 Oct 2020
My task is to write a function that simulates rolling a pair of 6-sided dice n times and uses this data to approximate probabilities of each of the possible outcomes of sums of the dice (2-12) and create a vertical bar graph that displays the frequency of each outcome. I have a solid program written up, however I am wondering if this program does what it should do and if it could be more efficient in some way. Here is what I have:
function prob = ex4(n)
%
%
rng('shuffle')
prob = zeros(1,12);
TotalNRolls = 0;
while TotalNRolls <= n
die(1) = randi(6);
die(2) = randi(6);
sum = die(1) + die(2);
TotalNRolls = TotalNRolls + 2;
if sum == 2
prob(2) = TotalNRolls/n;
elseif sum == 3
prob(3) = TotalNRolls/n;
elseif sum == 4
prob(4) = TotalNRolls/n;
elseif sum == 5
prob(5) = TotalNRolls/n;
elseif sum == 6
prob(6) = TotalNRolls/n;
elseif sum == 7
prob(7) = TotalNRolls/n;
elseif sum == 8
prob(8) = TotalNRolls/n;
elseif sum == 9
prob(9) = TotalNRolls/n;
elseif sum == 10
prob(10) = TotalNRolls/n
elseif sum == 11
prob(11) = TotalNRolls/n;
else
prob(12) = TotalNRolls/n;
end
end
bar(prob)

#### 1 Comment

Rik on 27 Oct 2020

jessupj on 27 Oct 2020
Edited: jessupj on 27 Oct 2020
rng('shuffle')
N = 1000; % total number of rolls you want
rollz=NaN(N,1);
for k=1:N;
rollz(k) = sum( randi([1 6],2,1) ); % add two uniiformly distr'd random ints from {1,2,3,4,5,6}
end
bar(rollz)
hist(rollz)

#### 1 Comment

Rik on 27 Oct 2020
It is generally discouraged to post complete solutions to homework questions. Please try to rephrase your solution so it contains pointers. That way students can learn from you, instead of being able to copy your work without having to think.

Rik on 27 Oct 2020
The Matlab way would be to use an array. If you read the documentation for randi you will see how you can generate a matrix with the integers 1 to 6.
If you then take a look at the documentation for the sum function, you can see how to sum either the rows or the column. That way you can calculate the sums of all your rolls at once.
The last step is then to get a bar chart of the distribution. You can use the bar function, but you can als look at other tools that allow you to make a histogram.
A final note: try to avoid using sum as a variable name, because that means you can't use the builtin function sum. (you should also avoid i, j, lowercase L, o, and O as variable names)

#### 1 Comment

Sophie Culhane on 27 Oct 2020
Thank you for the help.

Steven Lord on 27 Oct 2020
function prob = ex4(n)
%
%
rng('shuffle')
prob = zeros(1,12);
TotalNRolls = 0;
while TotalNRolls <= n
Conceptual question: what is n? Is it the number of dice you roll (in which case n = 3 would require rolling the pair of dice twice or require you to stop after your first roll lest you go over the number of dice you're allowed to roll?) Or is it the number of times you roll the pair of dice (in which case n = 3 would require rolling a total of six dice?)
die(1) = randi(6);
die(2) = randi(6);
Rather than calling randi twice, consider calling it once to get a 1-by-2 (or a 2-by-1) vector of random numbers. Take a look at the randi documentation, it contains examples showing how to generate more than one number at a time.
It also seems a bit odd to me to store the results of rolling a pair of dice (plural) in a variable named die (singular.)
sum = die(1) + die(2);
As Rik suggested, don't use sum as a variable name.
TotalNRolls = TotalNRolls + 2;
if sum == 2
prob(2) = TotalNRolls/n;
elseif sum == 3
prob(3) = TotalNRolls/n;
I wouldn't do the division inside the loop. I would just count how many times each result occurred inside the loop and divide by the number of rolls afterwards.
Also note that the lines of code in your if / elseif / else block look awfully similar. Do you see a pattern in the sum of the two rolled dice and which element of your probability vector needs to be updated? That whole if / elseif / else block can be collapsed to one line.