Поскольку вопрос касается визуализации вероятностей, я выбрал другой подход.
library(dplyr)
library(purrr)
library(ggplot2)
dice_roller <- function(n = 4, sides = 6, num_rolls = 1000) {
tibble(
rolls = rerun(num_rolls, sample.int(sides, n, replace = TRUE)),
lowest = map_dbl(rolls, ~min(.x)),
kept = map(rolls, ~.x[-which.min(.x)]),
sum = map_dbl(kept, ~sum(.x))
)
}
Эта функция принимает 3 аргумента: количество кубиков, тип кубиков и количество бросков.
- Затем для каждого броска он делает выборку целых чисел на основе количества сторон, а размер образца - это количество игральных костей.
- Затем он сопоставляет каждый бросок и находит минимальное значение, просто чтобы записать его для отображения.
- Затем он отображается на каждом броске и говорит: дать мне весь этот вектор, кроме индекса минимального значения.
- Затем он отображается на каждом векторе сохраненных значений, и записывает сумму.
- И возвращает все это в кадре данных для будущего исследования.
Так что, если мы запустим эту функцию (и немного кода для отображения) :
dice_roller() %>%
mutate_at(
vars(rolls, kept),
~map_chr(., paste, collapse = ",")
)
#> # A tibble: 1,000 x 4
#> rolls lowest kept sum
#> <chr> <dbl> <chr> <dbl>
#> 1 1,5,3,6 1 5,3,6 14
#> 2 2,5,3,5 2 5,3,5 13
#> 3 6,2,2,1 1 6,2,2 10
#> 4 1,1,5,4 1 1,5,4 10
#> 5 2,4,5,2 2 4,5,2 11
#> 6 1,1,3,1 1 1,3,1 5
#> 7 1,4,3,2 1 4,3,2 9
#> 8 1,3,4,3 1 3,4,3 10
#> 9 6,3,3,5 3 6,3,5 14
#> 10 3,4,6,5 3 4,6,5 15
#> # … with 990 more rows
Удобно, поэтому давайте посмотрим на вероятности!
ggplot(dice_roller(), aes(sum)) +
geom_histogram(binwidth = 1)
# Fewer dice per roll makes the distribution more skewed
ggplot(dice_roller(n = 3), aes(sum)) +
geom_histogram(binwidth = 1)
# More dice approaches a "normal" distribution of integers
ggplot(dice_roller(n = 10), aes(sum)) +
geom_histogram(binwidth = 1)
ggplot(dice_roller(num_rolls = 100000), aes(sum)) +
geom_histogram(binwidth = 1)
Создано в 2 020-04-20 по представлению пакета (v0.3.0)