Since the rolls are independent, it is not necessary to separate the rolls
into two stages:
sides <- 6
months <- 12
reps <- 100
set.seed(2022)
results <- matrix(sample.int(sides, months*reps, replace=TRUE), reps,
months, byrow=TRUE)
colnames(results) <- month.name
all6 <- apply(results, 1, function(x) length(intersect(x, 1:6))==6)
sum(all6)/reps
# 0.53 which matches Rui's result
results <- as.data.frame(results)
David L. Carlson
On Thu, Apr 21, 2022 at 4:04 AM Rui Barradas <ruipbarradas at sapo.pt>
wrote:
> Hello, There's an error in my code, inline. ?s 07:55 de 21/04/2022, Rui
> Barradas escreveu: > Hello, > > For what I understand of the
question, the
> followng might answer it. > > The functions below roll dice and
simulate R
> replicates
> ZjQcmQRYFpfptBannerStart
> This Message Is From an External Sender
> This message came from outside your organization.
>
> ZjQcmQRYFpfptBannerEnd
>
> Hello,
>
> There's an error in my code, inline.
>
> ?s 07:55 de 21/04/2022, Rui Barradas escreveu:
> > Hello,
> >
> > For what I understand of the question, the followng might answer it.
> >
> > The functions below roll dice and simulate R replicates of dice rolls.
> > Then 12 (one per month) 6 sided dice rolls are simulated 100 times.
> >
> > The colMeans/apply computes the empiric probabilities of having all 6
> > sides occur in each row, Jan to Dec and a overall probabilty is the
mean
> > of those probabilities.
> >
> > The matrix is coerced to data.frame only at the end.
> >
> >
> >
> > dice <- function(rolls = 1, ndice = 1, sides = 6) {
> > roll <- function(ndice = 1, sides = 6) {
> > sample(seq_len(sides), ndice, replace = TRUE)
> > }
> > y <- replicate(rolls, roll(ndice = ndice, sides = sides))
> > if(is.null(dim(y))) y else colSums(y)
> > }
> > dice_simul <- function(rolls = 1, ndice = 1, sides = 6, R) {
> > if(missing(R)) {
> > stop("number of simulations 'R' is missing with no
default.")
> > }
> > replicate(R, dice(rolls = rolls, ndice = ndice, sides = sides))
> > }
> >
> > dice_rolls <- 100
> > #dice_rolls <- 1e6
> > num_dice <- 1
> > dice_sides <- 6
> > months <- 12
> >
> > set.seed(2022)
> > prob_frame <- t(dice_simul(months, num_dice, dice_sides, R =
dice_rolls))
> > colnames(prob_frame) <- month.name
> > head(prob_frame)
> >
>
> # --- wrong
> > p <- colMeans(apply(prob_frame, 1, \(x) 1:6 %in% x))
> > mean(p)
> > # [1] 0.9116667
>
> This should be
>
> yes_no <- apply(prob_frame, 1, \(x) all(1:6 %in% x))
> p <- mean(yes_no)
> p
> # [1] 0.53
>
>
> Rui Barradas
>
>
>
> >
> > prob_frame <- as.data.frame(prob_frame)
> >
> >
> > Hope this helps,
> >
> > Rui Barradas
> >
> >
> > ?s 05:02 de 21/04/2022, Paul Bernal escreveu:
> >> Dear friend Bert,
> >>
> >> Thank you so much for your kind reply. The first thing I need to
do is to
> >> simulate dice rolls, say 120 times.
> >>
> >> I want to populate an m by 12 dataframe with the results of each
dice
> >> roll.
> >> For example, the result from dice roll #1 would need to go on row
1,
> >> column1, the result from dice roll #2 would have to go in row 1
column 2,
> >> and so on.
> >>
> >> The reason why I want to store those results in a dataframe is to
be able
> >> to perform some other calculations afterwards.
> >>
> >> This is for a project I am doing.
> >>
> >> So this is the situation:
> >> You and five friends ? a total of six people ? plan to meet once
per
> >> month
> >> to have dinner together, with one of you choosing the restaurant
each
> >> month. Rather than scheduling the entire year in advance, you
decide to
> >> make it interesting: each month a single six-sided die will be
rolled to
> >> determine which of you gets to choose the restaurant that month.
How
> >> likely
> >> is it that everyone will have a chance to eat at their own
favorite
> >> restaurant? That is, what is the probability p that over the next
12
> >> months, each of you will have had at least one opportunity to
choose
> >> where
> >> to eat?
> >>
> >> This is what I am asked to do:
> >> Write a program to estimate the desired probability p via
simulation. The
> >> program should input a sequence of positive integer number of
trials to
> >> simulate using the language's pseudorandom number generator
and calculate
> >> the corresponding fractions of simulated trials that are
?successful"
> >> (i.e., all 6 parties get at least one opportunity to choose where
to eat.
> >> Alice, Bob, Charley, Fred, Ellen, Don, Don, Don, Don, Alice,
Charley, Bob
> >> is a successful trial. Alice, Bob, Charley, Ellen, Don, Don, Don,
Don,
> >> Ellen, Alice, Charley, Bob is not a successful trial since Fred
does not
> >> get to choose.)
> >> Turn in a set of 10 trials showing each roll of the dice to show
> >> correctness. Label the out-comes. Keep in mind that a single trial
> >> requires
> >> rolling the die twelve times. Calculate and print the average
> >> probability p
> >> for the set. Please refer to your friends by name.
> >>
> >> For this reason, I am trying to simulate the n trials, and then
> >> populate a
> >> table with the results from the trials. I have to simulate a dice
roll
> >> dice
> >> for each month and for each row. Rows would be equivalent to
years, and
> >> then columns would be equivalent to the month of a particular
year.
> >>
> >> Once I store the results in a dataframe, everything is much
easier.
> >>
> >> I installed package dice and performed simulations by doing:
> >> #declaring variables:
> >> #1)dice_rolls which is the number of times the dice will be rolled
> >> #2)num_dice which is the number of dice that will be rolled each
time
> >> #3)dice_sides which is the number of sides of the dice
> >> #function dice will take each one of these variables as its
parameter to
> >> perform the simulation
> >> dice_rolls = 120
> >> num_dice = 1
> >> dice_sides = 6
> >>
> >> #performing simulation
> >> dice_simul = dice(rolls = dice_rolls, ndice = num_dice, sides >
>> dice_sides,
> >> plot.it = TRUE)
> >>
> >> I tried the following, but did not work as expected:
> >>
> >> for (i in 1:nrow(dice_simul)){
> >> for(j in 1:ncol(prob_frame)){
> >> for(k in 1:nrow(prob_frame)){
> >> prob_frame[k,j] = dice_simul[i,1]
> >> }
> >> }
> >> }
> >>
> >> I apologize for the long explanation.
> >>
> >> Best regards,
> >>
> >> Paul
> >>
> >>
> >> El mi?, 20 abr 2022 a las 22:47, Bert Gunter (<bgunter.4567 at
gmail.com>)
> >> escribi?:
> >>
> >>> If I understand you correctly, it's simple.
> >>> Matrices in R are vectors with a dimension attribute. By
default, they
> >>> are populated column by column. Use 'byrow = TRUE to
populate by row
> >>> instead. For example:
> >>>
> >>>> matrix (1:36, ncol = 12, byrow = TRUE)
> >>> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[,12]
> >>> [1,] 1 2 3 4 5 6 7 8 9 10 11
12
> >>> [2,] 13 14 15 16 17 18 19 20 21 22 23
24
> >>> [3,] 25 26 27 28 29 30 31 32 33 34 35
36
> >>>
> >>> I leave it to you to use the 'dimnames' argument of
?matrix to give
> >>> names to the column and then subsequently convert to a data
frame if
> >>> you like.
> >>>
> >>> Bert Gunter
> >>>
> >>> "The trouble with having an open mind is that people keep
coming along
> >>> and sticking things into it."
> >>> -- Opus (aka Berkeley Breathed in his "Bloom County"
comic strip )
> >>>
> >>> On Wed, Apr 20, 2022 at 8:38 PM Paul Bernal <paulbernal07
at gmail.com>
> >>> wrote:
> >>>>
> >>>> Dear friends,
> >>>>
> >>>> Hope you are doing well. I need to simulate a 1 dice roll
for each
> >>>> one of
> >>>> the twelve months of the year and perform 100 trials, so I
thought of
> >>>> constructing a dataframe with twelve columns and 100 rows
the following
> >>> way:
> >>>>
> >>>> num_rows = 100
> >>>>
> >>>> prob_frame <- data.frame(matrix(NA, nrow = num_rows,
ncol = 12))
> >>>>
> >>>
colnames(prob_frame)<-c("January","February","March","April","May","June","July","August","September","October","November","December")
> >>>
> >>>>
> >>>> Now, using the dice package, I can simulate n number of
dice rolls as
> >>>> follows:
> >>>> #performing simulation
> >>>> dice_simul = dice(rolls = dice_rolls, ndice = num_dice,
sides > >>> dice_sides,
> >>>> plot.it = TRUE)
> >>>>
> >>>> What I would like to do is to populate each column and row
with the
> >>> results
> >>>> of dice_simul.
> >>>>
> >>>> Let me show you the structure of dice_simul:
> >>>>> str(dice_simul)
> >>>> Classes ?dice? and 'data.frame': 100 obs. of 1
variable:
> >>>> $ Red: int 2 2 1 2 5 4 4 6 1 4 ...
> >>>>> dput(dice_simul)
> >>>> structure(list(Red = c(2L, 2L, 1L, 2L, 5L, 4L, 4L, 6L, 1L,
4L,
> >>>> 4L, 2L, 6L, 2L, 2L, 1L, 3L, 6L, 1L, 5L, 5L, 5L, 3L, 4L,
2L, 6L,
> >>>> 4L, 6L, 6L, 2L, 1L, 2L, 2L, 6L, 4L, 2L, 3L, 5L, 6L, 6L,
4L, 5L,
> >>>> 4L, 6L, 6L, 3L, 4L, 1L, 5L, 3L, 3L, 5L, 3L, 4L, 1L, 3L,
3L, 2L,
> >>>> 4L, 1L, 2L, 1L, 6L, 3L, 5L, 5L, 3L, 4L, 4L, 5L, 4L, 1L,
5L, 3L,
> >>>> 4L, 4L, 3L, 6L, 5L, 2L, 4L, 1L, 1L, 6L, 4L, 3L, 6L, 5L,
6L, 2L,
> >>>> 6L, 1L, 6L, 6L, 4L, 3L, 4L, 2L, 1L, 5L)), class =
c("dice",
> >>>> "data.frame"
> >>>> ), row.names = c(NA, -100L))
> >>>>
> >>>> For example, the first number of dice_simul should go to
row 1 for
> >>> January,
> >>>> the second number of dice_simul should go to row 1 for
February, ...
> >>>> the
> >>>> twelveth number of dice_simul should go to row 1 for
December, the 13th
> >>>> number should go to row 2 for january, and so on.
> >>>>
> >>>> This is what I tried to do but doesn?t work they way I
want to:
> >>>>
> >>>> #1)dice_rolls which is the number of times the dice will
be rolled
> >>>> #2)num_dice which is the number of dice that will be
rolled each time
> >>>> #3)dice_sides which is the number of sides of the dice
> >>>> #function dice will take each one of these variables as
its
> >>>> parameter to
> >>>> perform the simulation
> >>>> dice_rolls = 100
> >>>> num_dice = 1
> >>>> dice_sides = 6
> >>>>
> >>>> #performing simulation
> >>>> dice_simul = dice(rolls = dice_rolls, ndice = num_dice,
sides > >>> dice_sides,
> >>>> plot.it = TRUE)
> >>>>
> >>>> num_rows = 100
> >>>>
> >>>> prob_frame <- data.frame(matrix(NA, nrow = num_rows,
ncol = 12))
> >>>> colnames(prob_frame) <-
> >>>>
> >>>
c("January","February","March","April","May","June","July","August","September","October","November","December")
> >>>
> >>>>
> >>>>
> >>>> for (j in 1:12){
> >>>> for (i in 1:num_rows){
> >>>> prob_frame[i,j]=dice_simul[i,1]
> >>>> }
> >>>> }
> >>>> I basically want to populate the twelve months for the
first row, then
> >>> the
> >>>> twelve months for the second row, and so on, until I get
to populate
> >>>> the
> >>>> twelve months for the last row sequentially.
> >>>>
> >>>> How could I accomplish this?
> >>>>
> >>>> Any help and/or guidance will be greatly appreciated.
> >>>>
> >>>> Best regards,
> >>>> Paul
> >>>>
> >>>> [[alternative HTML version deleted]]
> >>>>
> >>>> ______________________________________________
> >>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and
more, see
> >>>>
https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help__;!!KwNVnqRv!GmY3d1J5JTqq58eyId3zjOPuWKBidPg_ojtvbhygQyudquxNCQkrcOT1xJfOQTFSlSxEJgiAwDPunCAbZaomfvI$
> >>>> PLEASE do read the posting guide
> >>>
https://urldefense.com/v3/__http://www.R-project.org/posting-guide.html__;!!KwNVnqRv!GmY3d1J5JTqq58eyId3zjOPuWKBidPg_ojtvbhygQyudquxNCQkrcOT1xJfOQTFSlSxEJgiAwDPunCAb7rrtTbc$
> >>>> and provide commented, minimal, self-contained,
reproducible code.
> >>>
> >>
> >> [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more,
see
> >>
https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help__;!!KwNVnqRv!GmY3d1J5JTqq58eyId3zjOPuWKBidPg_ojtvbhygQyudquxNCQkrcOT1xJfOQTFSlSxEJgiAwDPunCAbZaomfvI$
> >> PLEASE do read the posting guide
> >>
https://urldefense.com/v3/__http://www.R-project.org/posting-guide.html__;!!KwNVnqRv!GmY3d1J5JTqq58eyId3zjOPuWKBidPg_ojtvbhygQyudquxNCQkrcOT1xJfOQTFSlSxEJgiAwDPunCAb7rrtTbc$
> >> and provide commented, minimal, self-contained, reproducible code.
> >
> > ______________________________________________
> > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >
https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help__;!!KwNVnqRv!GmY3d1J5JTqq58eyId3zjOPuWKBidPg_ojtvbhygQyudquxNCQkrcOT1xJfOQTFSlSxEJgiAwDPunCAbZaomfvI$
> > PLEASE do read the posting guide
> >
https://urldefense.com/v3/__http://www.R-project.org/posting-guide.html__;!!KwNVnqRv!GmY3d1J5JTqq58eyId3zjOPuWKBidPg_ojtvbhygQyudquxNCQkrcOT1xJfOQTFSlSxEJgiAwDPunCAb7rrtTbc$
> > and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________R-help at r-project.org
mailing list -- To UNSUBSCRIBE and more,
seehttps://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help__;!!KwNVnqRv!GmY3d1J5JTqq58eyId3zjOPuWKBidPg_ojtvbhygQyudquxNCQkrcOT1xJfOQTFSlSxEJgiAwDPunCAbZaomfvI$
> PLEASE do read the posting guide
https://urldefense.com/v3/__http://www.R-project.org/posting-guide.html__;!!KwNVnqRv!GmY3d1J5JTqq58eyId3zjOPuWKBidPg_ojtvbhygQyudquxNCQkrcOT1xJfOQTFSlSxEJgiAwDPunCAb7rrtTbc$
> and provide commented, minimal, self-contained, reproducible code.
>
>
[[alternative HTML version deleted]]