Как можно проверить закон больших чисел на примере игральной кости, не дожидаясь слишком долгого времени?

<a href="https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB" rel="nofollow">Закон больших чисел</a> <br/> <br/> Часто приводимым примером является подбрасывание монеты: <br/> <pre><code class="rust">let mut coins = vec![];
    
    for _ in 0..1e6 as u32 {
        let mut rng = thread_rng();
        coins.push(rng.gen_range(0..=1));
    }
    
    let len_of_zero = coins.iter().filter(|&amp;&amp;c| c == 0).collect::&lt;Vec&lt;_&gt;&gt;().len() as f32;
    let len_of_one = coins.iter().filter(|&amp;&amp;c| c == 1).collect::&lt;Vec&lt;_&gt;&gt;().len() as f32;
    
    println!("Percent of 0: {}, Percent of 1: {}", 100. * (len_of_zero / coins.len() as f32), 100. * (len_of_one / coins.len() as f32));</code></pre> <br/> <br/> <br/> Этот пример достаточно наглядный и интуитивно понятный. <br/> Однако, когда я пробовал бросать игральную кость, мне не удалось достичь отклонения более чем на 3-4%. С чем это может быть связано?
  • 20 ноября 2024 г. 4:33
Ответы на вопрос 2
Закон больших чисел говорит о том, что при увеличении количества испытаний (подбрасываний) среднее значение результатов будет стремиться к математическому ожиданию. В случае игральной кости с равномерным распределением вероятностей для чисел от 1 до 6, математическое ожидание ожидания равно 3.5. Проверка закона больших чисел с помощью подбрасывания игральной кости может быть немного сложнее, чем с монетой, поскольку у вас 6 возможных исходов, а не 2.

Также стоит учитывать, что для получения статистически значимых результатов нужно достаточно много испытаний, что может занять определенное время. Для игральной кости, чтобы увидеть более явные результаты, можно использовать меньшее количество бросков, но при этом вам нужно подождать, чтобы результат был статистически надежным.

Вот как можно написать код на Rust для проверки закона больших чисел на примере игральной кости:

```rust
use rand::Rng;
use std::collections::HashMap;

fn main() {
    let mut rng = rand::thread_rng();
    let mut rolls = vec![];

    // Подбрасываем игральную кость 1000 раз
    for _ in 0..1000 {
        rolls.push(rng.gen_range(1..=6));
    }

    // Подсчитываем количество каждого результата
    let mut counts = HashMap::new();
    for &roll in &rolls {
        *counts.entry(roll).or_insert(0) += 1;
    }

    // Вычисляем проценты
    let total_rolls = rolls.len() as f32;
    for i in 1..=6 {
        let count = counts.get(&i).unwrap_or(&0);
        println!("Percent of {}: {:.2}%", i, 100.0 * (*count as f32 / total_rolls));
    }
}
```

Этот код:

1. Случайным образом генерирует 1000 бросков игральной кости.
2. Подсчитывает, сколько раз выпало каждое число от 1 до 6.
3. Выводит процент для каждого числа.

При запуске этого кода вы должны увидеть, что проценты для каждого результата стремятся к 16.67% (что соответствует 1/6) по мере увеличения количества бросков, хотя могут быть небольшие отклонения (3-4% в начале). С увеличением количества бросков, отклонение будет уменьшаться согласно закону больших чисел, и результаты будут ближе к равномерному распределению. 

Так что если вы хотите лучше видеть закон больших чисел в действии, добавьте больше бросков (например, 10,000 или 100,000), и вы увидите, как результаты будут сглаживаться и становиться ближе к ожидаемым.
1. всё-таки не bones, а dices 
2. (3..4).contains(&b)
Это то же самое, что и 3==b
16% - это как раз почти 1/6, так что всё сходится
Похожие вопросы