Моделирование подбрасывания монет Matlab

Мне нужно написать код в Matlab, который имитирует подбрасывание монеты 150 раз. Я должен подсчитать, сколько раз монета падает орлом, и создать вектор, который дает текущий процент выпадения орла.

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

Мне также нужно создать линейный график с испытаниями по оси x и вероятностями (процентами) по оси y. Я предполагаю, что проценты - это просто процент попаданий голов.

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

NUM_TRIALS = 150;
trials = 1:NUM_TRIALS;
heads = 0;
t = rand(NUM_TRIALS,1);
percent_h = zeros(size(t));

for i = trials

    if (t(i) < 0.5)
        heads = heads + 1;
        percent_h = heads./trials; 
    end   
end

flips = t;

disp('Number of Trials, Random flips, Heads Percentage')
disp([trials', flips, percent_h'])
plot(trials,percent_h)
title('Trial Number vs. Percent Heads')
xlabel('Trial number')
ylabel('Percent Heads')

person user1772959    schedule 14.12.2012    source источник


Ответы (2)


Ваш код на самом деле довольно близок к ответу на ваш вопрос, но есть несколько проблем, которые я вижу.

  • Вы должны индексировать t по номеру текущей пробной версии.
  • Аналогично, percent_h должен быть проиндексирован соответствующим образом. Это также должно быть предварительно выделено.
  • Не уверен, что z должен представлять...
  • Чтобы сделать сюжет, просто используйте plot. xlabel присвоит метку оси x, ylabel — оси y. title даст название сюжету.
  • Делить надо на i, а не на испытания.

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

NUM_TRIALS = 150;
trials = 1:NUM_TRIALS;
heads = 0;
t = rand(NUM_TRIALS,1);

percent_h=zeros(size(t));

for i = trials

    if (t(i) < 0.5)
        heads = heads + 1;
    end
    percent_h(i) = heads/i;  
end
plot(trials,percent_h)
xlabel('Trial Number')
ylabel('Percent Heads')
title ('Trial Number vs Percent Heads')

введите здесь описание изображения

person PearsonArtPhoto    schedule 14.12.2012
comment
Я думаю, мне нужно прочитать об индексации, потому что я не знал об этом. Я хожу на занятия по программированию, и они просто добавили Matlab в последние пару недель семестра. Я пытаюсь добавить больше информации здесь, но, похоже, это не позволит мне. Я отредактирую свой оригинальный пост. - person user1772959; 14.12.2012
comment
Вы должны делить на i, а не на испытания - person PearsonArtPhoto; 14.12.2012
comment
Я пробовал это, и я все еще получаю странные значения. Разделив на i, я получаю это сообщение об ошибке ??? Ошибка при использовании аргументов CAT ==> horzcat. Размеры несовместимы. Я думаю, что расчет вероятности хорош, потому что значения сходятся к 0,5, но график все еще гиперболический. - person user1772959; 14.12.2012
comment
Я выложу свою точную. возможно, что-то изменилось, что отбрасывает его. Я отредактирую OP с новейшим кодом. - person user1772959; 15.12.2012
comment
Я много раз пытался изменить код. Иногда используется precent_h, а иногда — процент_h(i). С точным кодом, как в ОП, но с процентом_h (i) это то, что я вижу: количество испытаний, случайные броски, процент орлов ??? Ошибка при использовании аргументов CAT ==> horzcat. Размеры несовместимы. - person user1772959; 15.12.2012
comment
С кодом в ОП работает хорошо. Я предполагаю, что график должен быть гиперболическим? Я думал, что график должен выглядеть так: engr.mun .ca/~ggeorge/4421/demos/t2/i26plot.jpg. Мой последний вопрос будет заключаться в том, как я могу преобразовать каждое случайное значение в головы или хвосты и отобразить это во 2-м столбце моей таблицы. Я хочу, чтобы ‹5 были решками. - person user1772959; 15.12.2012
comment
Это действительно другой вопрос ... Я разместил то, что я получаю на выходе, для вашего сравнения. - person PearsonArtPhoto; 15.12.2012
comment
Я не знаю, почему я не получаю график, который вы получаете. Не могли бы вы включить мой код для создания таблицы данных и посмотреть, получится ли у вас тот же график? Кажется, это единственная разница в коде. - person user1772959; 15.12.2012
comment
Наконец-то я заработал. Код немного отличается от вашего, потому что мне пришлось включить код для создания таблицы данных. Это и было причиной ошибки. Я думаю, что единственное, что мне нужно сделать сейчас, это возиться с командами типа num2str, чтобы заставить случайные числа стать либо «h», либо «t». Спасибо большое за вашу помощь. - person user1772959; 15.12.2012
comment
В нем говорится, что мне нужно 15 репутации, чтобы проголосовать за ответ. Сейчас у меня всего 14 очков репутации. - person user1772959; 15.12.2012

На самом деле вы можете решить эту проблему проще, воспользовавшись несколькими другими функциями MATLAB, как намекает @PearsonArtPhoto. Во-первых, вы можете использовать RANDI, чтобы сгенерировать подбрасывание монеты как один для голова. Затем вы можете использовать CUMSUM, чтобы получить общее количество голов. Разделив этот элемент на 1:n, вы получите совокупную долю голов.

n=150;
ishead = randi([0,1],1,n);
plot(cumsum(ishead)./(1:n));
person Edric    schedule 15.12.2012