2015-01-20 3 views
1

У меня действительно простой вопрос о массивах. Я смотрел некоторые уроки и не мог понять, почему приведенный ниже код дает частотные выходы как случайные комбинации из 1 **. Он никогда не дает чисел, таких как 5, 67, 541 и т. Д., Он всегда дает что-то вроде 150, 175, 183 и т. Д. Надеюсь, я ясно дал понять. Большое спасибо!Почему эта программа, которая генерирует случайные числа, продолжает генерировать числа в сотнях?

Код:

Random rand = new Random(); 
    int freq[] = new int[7]; 

    for(int roll=1; roll<=1000; roll++){ 

     ++freq[1+rand.nextInt(6)]; 
    } 

    System.out.println("Face\tFrequency"); 

    for(int face=1; face<freq.length; face++){ 
      System.out.println(face + "\t" + freq[face]); 
    } 

Пример вывода:

Face  Frequency 

1  176 

2  171 

3  157 

4  159 

5  164 

6  173 
+0

Это вопрос не столько массива, сколько вопрос о вероятности. Он ** мог ** дать небольшие цифры, это просто очень маловероятно. –

+0

Это связано со случайным распределением целых чисел от 0 до 5 (1-6). По статистике, все они одинаково вероятны, если рандомизатор действительно случайный, поэтому вы видите цифры, которые выглядят так, будто они могут быть «странными». Например, если посмотреть на «67» для 6, это означало бы, что 6 было свернуто только 67 раз из 1000, что маловероятно. Например, взвешенная матрица может приводить к номерам, которые не выглядят нормально распределенными, так как вероятность прокатки заданного числа не совпадает с другими. –

ответ

4

Это скорее математический вопрос, чем вопрос программирования!

Существует шесть возможных результатов для бросков кубиков, и вы бросаете кости 1000 раз. Это означает, что если вы хотите увидеть число, не имеющее формы «сто и X», вам нужно либо увидеть 200, либо более одного числа или 99 или меньше числа. Ожидаемое количество раз, когда вы увидите каждое число, равно 1000/6 = 166,7, поэтому для того, чтобы увидеть 200 или более чисел, вам нужно отклонить на +33.3 или -66.7 от истинного значения. Это может случиться; это просто необычно.

Я написал программу, которая имитировала скользящие кости таким образом, пока вы не получите один из этих типов рулонов и не подсчитаете, сколько раз вам нужно будет бросить кубики. Сделав это 1000 раз, я обнаружил, что в среднем вам нужно бросить кубик 53 раза, прежде чем вы увидите число, которое не находится в одной сотне. Вот код:

import java.util.*; 

public class DiceRolls { 
    /* The number of trials to run. */ 
    private static final int NUM_TRIALS = 1000; 

    public static void main(String[] args) { 
     Random rand = new Random(); 

     int totalRuns = 0; 
     for (int i = 0; i < NUM_TRIALS; i++) { 
      totalRuns += runsUntilEvent(rand); 
     } 
     System.out.println(totalRuns/(double)NUM_TRIALS); 
    } 

    private static int runsUntilEvent(Random rand) { 
     /* Track how many tries we needed. */ 
     int numTries = 0; 
     while (true) { 
      numTries++; 

      /* Rather than indexing from 1 to 6, I'm indexing from 0 to 5. */ 
      int freq[] = new int[6];    
      for(int roll = 0; roll < 1000; roll++){ 
       ++freq[rand.nextInt(6)]; 
      } 

      /* See if this isn't in the hundreds. */ 
      for(int face = 0; face < freq.length; face++){     
       if (freq[face] >= 200 || freq[face] <= 99) { 
        return numTries; 
       } 
      } 
     } 
    } 
} 

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

Надеюсь, это поможет!

+0

О, я понял. Таким образом, это в основном дает мне результат «количества раз, когда определенное лицо появилось из 1000 рулонов». Как лицо 1 появилось 176 раз, а лицо 2 появилось 171 раз и т. Д. Я думал, что программа сделала что-то еще. Учитывая эту перспективу, как вы сказали, это возможно, но очень маловероятно, чтобы определенное лицо появлялось ниже 150 и выше 200 и гораздо более маловероятно появляться примерно в 5 раз. Ничего себе, я такой тупой :) Спасибо за помощь! –

0

Это нормально. Частота 5 была бы очень необычной, потому что это означало бы, что число было всего лишь 5 раз из 1000. Цифры, которые вы получаете, составляют около 1/6 от всего 1000 рулонов, поэтому каждый из шести номеров скатывается примерно на один шестой раз.

+0

Спасибо за простое объяснение, действительно помогли! –

0

Из-за того, что вы зацикливаете 1000 раз, отклонение довольно мало.

Если вы зацикливаете только 10 раз, но увеличиваете числа на 100 в цикле, вы получаете более высокое отклонение.

0

Вывод - это количество раз, когда число найдено в каждом «броске кубиков». Поскольку вы используете генерацию псевдослучайных чисел, генерация числа считается «справедливой», поэтому у вас есть «честный рулон кости», а это значит, что в среднем каждое число имеет равные шансы на каждый ролл.

Следовательно, каждое число должно отображаться в среднем почти в 1/6 раза от всех рулонов, которые являются результатами, которые у вас есть сейчас.

Если вы увеличиваете количество всех рулонов, отклонение 1/6 между каждым числом будет больше и увеличится по аналогии с количеством рулонов.

0

Я предполагаю, что ваш оригинальный вопрос - почему вы не получаете низкие значения, например, ниже 100 (менее 10%) или более 500 (более 50%).

Короткий ответ, вам не повезло. Поскольку вы создали свой случайный генератор, вам нужно запустить свою программу еще много раз, чтобы наблюдать эти значения.

Подсчитаем вероятность любого исхода (частоты) встречаются более чем в 50% случаев, если запустить программу только один раз: Это можно легко оценить, если мы катимся парами (например, 1000 рулонов 500 пар)

для каждой пары, вероятность некоторой определенной стороне (например, 6) представляет собой число квалифицированных результатов, деленное на общее число результатов:

квалифицированные результатов (для стороны 6, происходит в 50% рулонах или более):

16, 26, 36, 46, 56, 66, 
61, 62, 63, 64, 65 

Всего результатов: 6^2 = 36

Так 11 квалифицированных результатов, поделенное на общее дает вероятность одной стороны, происходит 50% времени или больше, что является 11/36

Теперь нам нужно, чтобы это произошло N/2 раза подряд, поэтому мы должны умножить вероятность пары N/2 раза: (11/36)^(N/2)

Wolfram alpha дает нам 3.5 * 10^-258, что означает, что вам нужно запустите свою программу 2.85 * 10^257 раз, чтобы ожидать (один раз) частоты одной конкретной стороны 500 и более раз.

Разделите это на 6, чтобы увидеть это для любое сторона.