Решение задач о бросании игральных костей
Еще одна популярная задача теории вероятностей (наравне с задачей о подбрасывании монет) — задача о подбрасывании игральных костей.
Обычно задача звучит так: бросается одна или несколько игральных костей (обычно 2, реже 3). Необходимо найти вероятность того, что число очков равно 4, или сумма очков равна 10, или произведение числа очков делится на 2, или числа очков отличаются на 3 и так далее.
Основной метод решения подобных задач — использование формулы классической вероятности, который мы и разберем на примерах ниже.
Ознакомившись с методами решения, вы сможете скачать супер-полезный Excel-файл для расчета вероятности при бросании 2 игральных костей (с таблицами и примерами).
Нужна помощь? Решаем теорию вероятностей на отлично
- Одна игральная кость
- Две игральные кости
- Другие задачи
- Полезные ссылки
Понравилось? Добавьте в закладки
Одна игральная кость
С одной игральной костью дело обстоит до неприличия просто. Напомню, что вероятность находится по формуле $P=m/n$, где $n$ — число всех равновозможных элементарных исходов эксперимента с подбрасыванием кубика или кости, а $m$ — число тех исходов, которые благоприятствуют событию.
Пример 1. Игральная кость брошена один раз. Какова вероятность, что выпало четное число очков?
Так как игральная кость представляет собой кубик (еще говорят, правильная игральная кость, то есть кубик сбалансированный, так что выпадает на все грани с одинаковой вероятностью), граней у кубика 6 (с числом очков от 1 до 6, обычно обозначаемых точкам), то и общее число исходов в задаче $n=6$. Благоприятствуют событию только такие исходы, когда выпадет грань с 2, 4 или 6 очками (только четные), таких граней $m=3$. Тогда искомая вероятность равна $P=3/6=1/2=0.5$.
Пример 2. Брошен игральный кубик. Найти вероятность выпадения не менее 5 очков.
Рассуждаем также, как и в предыдущем примере. Общее число равновозможных исходов при бросании игрального кубика $n=6$, а условию «выпало не менее 5 очков», то есть «выпало или 5, или 6 очков» удовлетворяют 2 исхода, $m=2$. Нужная вероятность равна $P=2/6=1/3=0.333$.
Даже не вижу смысла приводить еще примеры, переходим к двум игральным костям, где все интереснее и сложнее.
Две игральные кости
Когда речь идет о задачах с бросанием 2 костей, очень удобно использовать таблицу выпадения очков. По горизонтали отложим число очков, которое выпало на первой кости, по вертикали — число очков, выпавшее на второй кости. Получим такую заготовку (обычно я делаю ее в Excel, файл вы сможете скачать ниже):
А что же в ячейках таблицы, спросите вы? А это зависит от того, какую задачу мы будем решать. Будет задача про сумму очков — запишем туда сумму, про разность — запишем разность и так далее. Приступаем?
Пример 3. Одновременно бросают 2 игральные кости. Найти вероятность того, что в сумме выпадет менее 5 очков.
Сначала разберемся с общим числом исходов эксперимента. когда мы бросали одну кость, все было очевидно, 6 граней — 6 исходов. Здесь костей уже две, поэтому исходы можно представлять как упорядоченные пары чисел вида $(x,y)$, где $x$ — сколько очков выпало на первой кости (от 1 до 6), $y$ — сколько очков выпало на второй кости (от 1 до 6). Очевидно, что всего таких пар чисел будет $n=6\cdot 6=36$ (и им соответствуют как раз 36 ячеек в таблице исходов).
Вот и пришло время заполнять таблицу. В каждую ячейку занесем сумму числа очков выпавших на первой и второй кости и получим уже вот такую картину:
Теперь эта таблица поможем нам найти число благоприятствующих событию «в сумме выпадет менее 5 очков» исходов. Для этого подсчитаем число ячеек, в которых значение суммы будет меньше 5 (то есть 2, 3 или 4). Для наглядности закрасим эти ячейки, их будет $m=6$:
Тогда вероятность равна: $P=6/36=1/6$.
Пример 4. Брошены две игральные кости. Найти вероятность того, что произведение числа очков делится на 3.
Составляем таблицу произведений очков, выпавших на первой и второй кости. Сразу выделяем в ней те числа, которые кратны 3:
Остается только записать, что общее число исходов $n=36$ (см. предыдущий пример, рассуждения такие же), а число благоприятствующих исходов (число закрашенных ячеек в таблице выше) $m=20$. Тогда вероятность события будет равной $P=20/36=5/9$.
Как видно, и этот тип задач при должной подготовке (разобрать еще пару тройку задач) решается быстро и просто. Сделаем для разнообразия еще одну задачу с другой таблицей (все таблицы можно будет скачать внизу страницы).
Пример 5. Игральную кость бросают дважды. Найти вероятность того, что разность числа очков на первой и второй кости будет от 2 до 5.
Запишем таблицу разностей очков, выделим в ней ячейки, в которых значение разности будет между 2 и 5:
Итак, что общее число равновозможных элементарных исходов $n=36$, а число благоприятствующих исходов (число закрашенных ячеек в таблице выше) $m=10$. Тогда вероятность события будет равной $P=10/36=5/18$.
Итак, в случае, когда речь идет о бросании 2 костей и простом событии, нужно построить таблицу, выделить в ней нужные ячейки и поделить их число на 36, это и будет вероятностью. Помимо задач на сумму, произведение и разность числа очков, также встречаются задачи на модуль разности, наименьшее и наибольшее выпавшее число очков (подходящие таблицы вы найдете в файле Excel).
Другие задачи про кости и кубики
Конечно, разобранными выше двумя классами задач про бросание костей дело не ограничивается (просто это наиболее часто встречаемые в задачниках и методичках), существуют и другие. Для разнообразия и понимания примерного способа решения разберем еще три типовых примера: на бросание 3 игральных костей, на условную вероятность и на формулу Бернулли.
Пример 6. Бросают 3 игральные кости. Найдите вероятность того, что в сумме выпало 15 очков.
В случае с 3 игральными костями таблицы составляют уже реже, так как их нужно будет аж 6 штук (а не одна, как выше), обходятся простым перебором нужных комбинаций.
Найдем общее число исходов эксперимента. Исходы можно представлять как упорядоченные тройки чисел вида $(x,y,z)$, где $x$ — сколько очков выпало на первой кости (от 1 до 6), $y$ — сколько очков выпало на второй кости (от 1 до 6), $z$ — сколько очков выпало на третьей кости (от 1 до 6). Очевидно, что всего таких троек чисел будет $n=6\cdot 6\cdot 6=216$ .
Теперь подберем такие исходы, которые дают в сумме 15 очков.
Получили $m=3+6+1=10$ исходов. Искомая вероятность $P=10/216=0.046$.
Пример 7. Бросают 2 игральные кости. Найти вероятность того, что на первой кости выпало не более 4 очков, при условии, что сумма очков четная.
Наиболее простой способ решения этой задачи — снова воспользоваться таблицей (все будет наглядно), как и ранее. Выписываем таблицу сумм очков и выделяем только ячейки с четными значениями:
Получаем, что согласно условию эксперимента, всего есть не 36, а $n=18$ исходов (когда сумма очков четная).
Теперь из этих ячееек выберем только те, которые соответствуют событию «на первой кости выпало не более 4 очков» — то есть фактически ячейки в первых 4 строках таблицы (выделены оранжевым), их будет $m=12$.
Искомая вероятность $P=12/18=2/3.$
Эту же задачу можно решить по-другому, используя формулу условной вероятности. Введем события:
А = Сумма числа очков четная
В = На первой кости выпало не более 4 очков
АВ = Сумма числа очков четная и на первой кости выпало не более 4 очков
Тогда формула для искомой вероятности имеет вид: $$ P(B|A)=\frac. $$ Находим вероятности. Общее число исходов $n=36$, для события А число благоприятствующих исходов (см. таблицы выше) $m(A)=18$, а для события АВ — $m(AB)=12$. Получаем: $$ P(A)=\frac=\frac=\frac; \quad P(AB)=\frac=\frac=\frac;\\ P(B|A)=\frac=\frac=\frac. $$ Ответы совпали.
Пример 8. Игральный кубик брошен 4 раза. Найти вероятность того, что четное число очков выпадет ровно 3 раза.
В случае, когда игральный кубик бросается несколько раз, а речь в событии идет не о сумме, произведении и т.п. интегральных характеристиках, а лишь о количестве выпадений определенного типа, можно для вычисления вероятности использовать формулу Бернулли.
Итак, имеем $n=4$ независимых испытания (броски кубика), вероятность выпадения четного числа очков в одном испытании (при одном броске кубика) равна $p=3/6=1/2=0.5$ (см. выше задачи для одной игральной кости).
Тогда по формуле Бернулли $P=P_n(k)=C_n^k \cdot p^k \cdot (1-p)^$, подставляя $k=3$, найдем вероятность того, что четное число очков появится 3 раза: $$ P_4(3)=C_4^3 \cdot \left(1/2\right)^3 \cdot \left(1-1/2\right)^1=4 \cdot \left(1/2\right)^4=1/4=0,25. $$
Приведем еще пример, решаемый аналогичным образом.
Пример 9. Игральную кость бросают 8 раз. Найти вероятность того, что шестёрка появится хотя бы один раз.
Подставляем в формулу Бернулли следующие значения: $n=8$ (число бросков), $p=1/6$ (вероятность появления 6 при одном броске), $k\ge 1$ (хотя бы один раз появится шестерка). Прежде чем вычислять эту вероятность, напомню, что практически все задачи с формулировкой «хотя бы один. » удобно решать, переходя к противоположному событию «ни одного. «. В нашем примере сначала стоит найти вероятность события «Шестёрка не появится ни разу», то есть $k=0$: $$ P_8(0)=C_8^0 \cdot \left(1/6\right)^0 \cdot \left(1-1/6\right)^8=\left(5/6\right)^8. $$ Тогда искомая вероятность будет равна $$ P_8(k\ge 1)=1-P_8(0)=1-\left(5/6\right)^8=0.767. $$
Полезные ссылки
Для наглядного и удобного расчета вероятностей в случае бросания двух игральных костей я сделала
Файл с таблицами для расчета вероятности.
В нем приведены таблицы суммы, произведения, разности, минимума, максимума, модуля разности числа очков.
Вводя число благоприятствующих исходов в специальную ячейку вы получите рассчитанную вероятность (в обычных и десятичных дробях). Файл открывается программой Excel.
Еще по теории вероятностей:
Лучшее спасибо — порекомендовать эту страницу
В решебнике вы найдете более 400 задач о бросании игральных костей и кубиков с полными решениями (вводите часть текста для поиска своей задачи):
Бросаем 2 кубика найти вероятность того что
Вероятность выпадения чисел при бросании двух игральных костей
В игре участвуют две игральные кости, и каждая игральная кость имеет 6 граней. Таким образом, возможно всего 36 различных комбинаций с суммами между 2 и 12.
Следующая таблица комбинаций игральных костей разъясняет это:
Как Вы видите из таблицы:
Только 1 комбинация даст Вам 2 и 12
2 комбинации дадут Вам 3 и 11
3 комбинации дадут Вам 4 и 10
4 комбинации дадут Вам 5 и 9
5 комбинаций дадут Вам 6 и 8
и самое большее — 6 комбинаций дадут Вам 7
В процентах:
2 — 2,7 %
3 — 5,5 %
4 — 8,3 %
5 — 11,1 %
6 — 13,8 %
7 — 16,6 %
8 — 13,8 %
9 — 11,1 %
10 — 8,3 %
11 — 5,5 %
12 — 2,7 %
Итого 99,4 % (0,6 % ушло на округления)
Проверить лично можно сыграв несколько партий у нас, на сайте https://monopolystar.ru/
Последний раз редактировалось Oboronitel; 06.06.2023 в 16:56 .
Общий рейтинг: 149670
Регистрация: 20.01.2014
Сообщений: 1
Общий рейтинг: 4208
Регистрация: 16.03.2014
Сообщений: 1
В подобных играх (онлайн разных жанров) как правило существует «ранд». В данном случае — на каждое число или комбинацию. Т.е., для каждого числа вероятность его выпадения фактически одинакова. НО можно изначально программно повысить «сложность», сделать некоторые числа «раритетными», вероятность выпадения которых будет ниже всех остальных.
Данная таблица, как мнение, имеет право на существование, но считаю, что она вовсе не объективна. Конкретно здесь. Вероятность, выставляемая администрацией, совсем не обязана подчиняться логике, результат которой здесь и приведён. Естественно, это всего лишь моё мнение, всем мира!
Юлин_котик |
Посмотреть профиль |
Отправить личное сообщение для Юлин_котик |
Найти ещё сообщения от Юлин_котик |
Общий рейтинг: 212
Регистрация: 08.11.2012
Сообщений: 15
Сообщение от Юлин_котик
В подобных играх (онлайн разных жанров) как правило существует «ранд». В данном случае — на каждое число или комбинацию. Т.е., для каждого числа вероятность его выпадения фактически одинакова. НО можно изначально программно повысить «сложность», сделать некоторые числа «раритетными», вероятность выпадения которых будет ниже всех остальных.
Данная таблица, как мнение, имеет право на существование, но считаю, что она вовсе не объективна. Конкретно здесь. Вероятность, выставляемая администрацией, совсем не обязана подчиняться логике, результат которой здесь и приведён. Естественно, это всего лишь моё мнение, всем мира!
Ваше замечание верно если тут один счетчик случайного числа сразу на 2 кубика(2-12).
Но возможно тут при бросание кубиков программа рандомит каждый кубик по отдельности, тогда эта таблица будет также справедлива.
Da_Dao_MedveD |
Посмотреть профиль |
Отправить личное сообщение для Da_Dao_MedveD |
Найти ещё сообщения от Da_Dao_MedveD |
Общий рейтинг: 639
Регистрация: 11.04.2011
Сообщений: 945
Da_Dao_MedveD, Юлин_котик, полезно будет прочитать. Абсолютно ничего не не меняли в стандартном рендоме, поэтому таблица вероятностей полностью соответствует Вашему игровому процессу.
Последний раз редактировалось Maxim; 09.10.2016 в 08:46 .
Капиталист
Общий рейтинг: 775
Регистрация: 31.12.2013
Сообщений: 8
Re: Вероятность выпадения чисел при бросании двух игральных костей
Враньё! Вероятность с тюрьмы и с отдыха выкинуть 5 очень велика. Или очень с высокой доли вероятности можно сказать, что я попаду на + или -. Так, что вероятность в первом посте- ТУФТА!
Или замечали такое, что можно раза 3 или 4 подряд со старта попадаешь на «тюрьму» и перемещаешься на отдых. Так же и с выхода из «тюрьмы» попадаешь на «отдых» и в тюрьму опят. Не замечали? Так, что объективности «СЛУЧАЙНЫХ» цифр тут не работает. Т.е попросту- ОБМАН!
Бросают 2 кубика. Найти вероятность того, что произведение выпавших очков будет чётным?
Исходим из обратного. Произведение будет нечетным, если оба кубика будут иметь нечетные очки Вероятность этого равна 1/2 * 1/2 = 1/4.
Значит, вероятность того, что хотя бы на одном из кубиков будет четное число, равна
1 — 1/4 = 3/4
Остальные ответы
При бросании кубиков бесконечное количество раз, то по теории вероятности выпадут четные и нечетные 50 х 50.
загодать о четном числе и думать о нем то тогда 85%что выподет четное
Ответ: 3/4
Указание:
Возможные исходы:
ч ч
ч н
н ч
н н
Всего 4 исхода — и только один из них неблагоприятный.
Найти вероятность выпадения k (сумма выпавших значений) при бросании n кубиков (часть 1 из 2)
На одном из собеседований по приёму на работу попросили за 30 минут написать программу, которая бы решал следующую задачу:
Есть n стандартных игральных костей (6-ти гранных кубиков) со стандартным обозначением всех граней от 1 до 6. Бросаем все n кубики разом. Нужно найти вероятность выпадения числа k, а именно суммы всех значений, выпавших на этих кубиках.
Решение
Не буду томить ожиданием и сразу выложу код алгоритма, который получился и впоследствии был немного обработан напильником.
# -*- coding: utf-8 -*- # import numpy # def main(): c_int_side_dice: int = 6 # сколько граней у кубика c_int_dice_number: int = 6 # кол-во кубиков c_int_number_to_find: int = 18 # число, вероятность выпадения которого хотим найти probability = dice_probability(c_int_dice_number, c_int_number_to_find, c_int_side_dice) print(probability) # собственно поиск вероятности определённого значения def dice_probability(int_dice_number: int, int_number_to_find: int, c_int_side_dice: int) -> float: list_values, list_interm_probability = list_values_and_interm_probabilities(int_dice_number, c_int_side_dice) if int_number_to_find < list_values[0] or int_number_to_find >list_values[-1]: # задаваемое число выходит за рамки реально возможного диапазона значений result_out: float = 0.0 else: for i in range(len(list_values)): if list_values[i] == int_number_to_find: result_out: float = list_interm_probability[i] / (c_int_side_dice ** int_dice_number) break return result_out # возвращает списки/массивы: значения (сумма выпавших всех значений кубиков), сколько раз встречается значение def list_values_and_interm_probabilities(int_dice_number: int, c_int_side_dice: int) -> tuple[list[int], list[int]]: # [кол-во кубиков], [сколько граней у кубика] list_values = [i for i in range(int_dice_number, c_int_side_dice * int_dice_number + 1)] # list_interm_probability = [1] * c_int_side_dice # [1, 1, 1, 1, 1, 1] for i in range(int_dice_number - 1): list_interm_probability = multiply_by_ones(list_interm_probability, c_int_side_dice) # # list_interm_probability = numpy.convolve(list_interm_probability, [1] * c_int_side_dice) # и не использовать multiply_by_ones() return list_values, list_interm_probability # "умножение" на единицы def multiply_by_ones(list_in: list[int], c_int_side_dice: int) -> list[int]: # [1, 1, 1, 1, 1, 1], 6 list_dummy: list[list[int]] = [] for i in range(c_int_side_dice): list_dummy.append([0] * i) # [], [0], [0, 0], [0, 0, 0] . list_for_sum: list[list[int]] = [] for i in range(c_int_side_dice): list_for_sum.append(list_dummy[i] + list_in + list_dummy[c_int_side_dice - i - 1]) """ [list_in, 0, 0, 0, 0, 0] [0, list_in, 0, 0, 0, 0] [0, 0, list_in, 0, 0, 0] [0, 0, 0, list_in, 0, 0] [0, 0, 0, 0, list_in, 0] [0, 0, 0, 0, 0, list_in] """ list_out: list[int] = [] for i in range(len(list_for_sum[0])): sum_out: int = 0 for j in range(c_int_side_dice): sum_out += list_for_sum[j][i] list_out.append(sum_out) """ [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1] """ return list_out if __name__ == "__main__": main()
JavaScript
function main() < const c_int_side_dice = 6; // сколько граней у кубика const c_int_dice_number = 6; // кол-во кубиков const c_int_number_to_find = 18; // число, вероятность выпадения которого хотим найти let probability = dice_probability(c_int_dice_number, c_int_number_to_find, c_int_side_dice); console.log(probability); >// собственно поиск вероятности определённого значения function dice_probability(int_dice_number, int_number_to_find, c_int_side_dice) < let lists_val_and_prob = list_values_and_interm_probabilities(int_dice_number, c_int_side_dice); let result_out; if (int_number_to_find < lists_val_and_prob[0][0] || int_number_to_find >lists_val_and_prob[0][lists_val_and_prob[0].length - 1]) < // задаваемое число выходит за рамки реально возможного диапазона значений result_out = 0.0; >else < for (let i = 0; i < lists_val_and_prob[0].length; i++)< if (lists_val_and_prob[0][i] == int_number_to_find)< result_out = lists_val_and_prob[1][i] / Math.pow(c_int_side_dice, int_dice_number); break; >> > return result_out; > // возвращает списки/массивы: значения (сумма выпавших всех значений кубиков), сколько раз встречается значение function list_values_and_interm_probabilities(int_dice_number, c_int_side_dice) < // [кол-во кубиков], [сколько граней у кубика] let list_values = new Array(); let i = 0; for (let j = int_dice_number; j console.log(list_values); let list_interm_probability = Array(c_int_side_dice).fill(1); // [1, 1, 1, 1, 1, 1] for (let i = 0; i < int_dice_number - 1; i++)< list_interm_probability = multiply_by_ones(list_interm_probability, c_int_side_dice); >console.log(list_interm_probability); return [list_values, list_interm_probability]; > // "умножение" на единицы function multiply_by_ones(list_in, c_int_side_dice) < let list_dummy = new Array(c_int_side_dice); for (let j = 0; j < c_int_side_dice; j++)< list_dummy[j] = Array(j).fill(0); >let list_for_sum = new Array(c_int_side_dice); for (let j = 0; j < c_int_side_dice; j++)< list_for_sum[j] = list_dummy[j].concat(list_in, list_dummy[c_int_side_dice - j - 1]); >// [list_in, 0, 0, 0, 0, 0] // [0, list_in, 0, 0, 0, 0] // [0, 0, list_in, 0, 0, 0] // [0, 0, 0, list_in, 0, 0] // [0, 0, 0, 0, list_in, 0] // [0, 0, 0, 0, 0, list_in] let list_out = new Array(); for (let i = 0; i < list_for_sum[0].length; i++)< let sum_out = 0; for (let j = 0; j < c_int_side_dice; j++)< sum_out += list_for_sum[j][i]; >list_out[i] = sum_out; > // [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1] return list_out; > main();
Option Explicit Sub main() Const c_int_side_dice = 6 'сколько граней у кубика Const c_int_dice_number = 3 'кол-во кубиков Const c_int_number_to_find = 10 'число, вероятность выпадения которого хотим найти Dim probability probability = dice_probability(c_int_dice_number, c_int_number_to_find, c_int_side_dice) MsgBox probability End Sub 'собственно поиск вероятности определённого значения Function dice_probability(int_dice_number, int_number_to_find, c_int_side_dice) Dim list_values() Dim list_interm_probability() list_values_and_interm_probabilities int_dice_number, c_int_side_dice, list_values, list_interm_probability Dim result_out Dim i If int_number_to_find < list_values(0) Or int_number_to_find >list_values(UBound(list_values)) Then 'задаваемое число выходит за рамки реально возможного диапазона значений result_out = 0.0 Else For i = 0 To UBound(list_values) If list_values(i) = int_number_to_find Then result_out = list_interm_probability(i) / (c_int_side_dice ^ int_dice_number) End If Next End If dice_probability = result_out End Function 'возвращает списки/массивы: значения (сумма выпавших всех значений кубиков), сколько раз встречается значение Sub list_values_and_interm_probabilities(int_dice_number, c_int_side_dice, list_values, list_interm_probability) '[кол-во кубиков], [сколько граней у кубика] ReDim list_values(int_dice_number * (c_int_side_dice - 1)) Dim i, j i = 0 For j = int_dice_number To c_int_side_dice * int_dice_number list_values(i) = j i = i + 1 Next ReDim list_interm_probability(c_int_side_dice - 1) For j = 0 To c_int_side_dice - 1 list_interm_probability(j) = 1 Next For j = 0 To int_dice_number - 2 multiply_by_ones list_interm_probability, c_int_side_dice Next End Sub '"умножение" на единицы Sub multiply_by_ones(list_in, c_int_side_dice) Dim list_in_length list_in_length = UBound(list_in) Dim list_for_sum() ReDim list_for_sum(c_int_side_dice - 1, list_in_length + c_int_side_dice - 1) Dim i, j, k, n For i = 0 To c_int_side_dice - 1 j = 0 For n = 0 To c_int_side_dice - 1 If i = n Then For k = 0 To list_in_length list_for_sum(i, j) = list_in(k) j = j + 1 Next Else list_for_sum(i, j) = 0 j = j + 1 End If Next Next ' [list_in, 0, 0, 0, 0, 0] ' [0, list_in, 0, 0, 0, 0] ' [0, 0, list_in, 0, 0, 0] ' [0, 0, 0, list_in, 0, 0] ' [0, 0, 0, 0, list_in, 0] ' [0, 0, 0, 0, 0, list_in] ' ArrOut_2 list_for_sum Erase list_in ReDim list_in(list_in_length + c_int_side_dice - 1) Dim sum_out For j = 0 To list_in_length + c_int_side_dice - 1 sum_out = 0 For i = 0 To c_int_side_dice - 1 sum_out = sum_out + list_for_sum(i, j) Next list_in(j) = sum_out Next ' [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1] ' ArrOut_1 list_in End Sub '================================================== ' Sub ArrOut_1(arr_in) Dim str_out Dim i For i = 0 To UBound(arr_in) If i = 0 Then str_out = arr_in(i) Else str_out = str_out & " " & arr_in(i) End If Next MsgBox str_out End Sub Sub ArrOut_2(arr_in) Dim str_out Dim i, j For i = 0 To UBound(arr_in, 1) For j = 0 To UBound(arr_in, 2) If i = 0 And j = 0 Then str_out = arr_in(i, j) ElseIf j = 0 Then str_out = str_out & vbNewLine & arr_in(i, j) Else str_out = str_out & " " & arr_in(i, j) End If Next Next MsgBox str_out End Sub ' '================================================== main
Пояснение
Понятно, что копание в чужом коде — дело не благодарное, опишу работу алгоритма для одного конкретного примера.
Картинку можно описать словами как: нахождение делимого вероятности выпадения при помощи многократной свёртки последовательности [1 1 1 1 1 1] на саму себя. Количество операций свёртки совпадает с количеством кубиков минус 1.
Смею предположить, что дочитав до этого момента у многих читателей уже зародятся скептические настроения, однако в свою очередь предложу поверить самостоятельно и в помощь приложу SQL запрос, который считает «в лоб», т.е. генерирует все возможные комбинации выпадения для 3-х кубиков, а потом пересчитывает все выпавшие суммы. В результате отработки скрипта мы получим 2 столбца из самого конца пункта “Этап I. Генерация 2-х списков/массивов: Значения (сумма выпавших костей) И Сколько раз встречается значение”.
SQL запрос — генератор решения «в лоб»
-- заводим значения сторон кубика WITH step_01_insert (dice) AS ( SELECT 1 AS dice UNION ALL SELECT 2 AS dice UNION ALL SELECT 3 AS dice UNION ALL SELECT 4 AS dice UNION ALL SELECT 5 AS dice UNION ALL SELECT 6 AS dice ) -- генерируем все возможные ситуации для 3-х кубиков , step_02_spawn (dice_1, dice_2, dice_3, dice_sum) AS ( SELECT T1.dice AS dice_1 , T2.dice AS dice_2 , T3.dice AS dice_3 , T1.dice + T2.dice + T3.dice AS dice_sum -- Значения (сумма выпавших костей) FROM step_01_insert AS T1 , step_01_insert AS T2 , step_01_insert AS T3 ) -- считаем в лоб, сколько раз встречается значение SELECT dice_sum -- Значения (сумма выпавших костей) , COUNT(1) AS num -- Сколько раз встречается значение FROM step_02_spawn GROUP BY dice_sum ORDER BY dice_sum;