Симулировать нечестную смерть - PullRequest
0 голосов
/ 28 сентября 2018

Итак, я должен смоделировать бросок нечестного кубика в MATLAB, у которого есть 20% вероятности показать каждое лицо от 1 до 4, и 10% вероятности показать каждое лицо от 5 до 6. Я имеюсгенерировать 5000 случайных целых чисел, представляющих результаты броска кубика.Я также должен распечатать смоделированное ожидаемое значение и стандартное отклонение, используя 5000 повторных испытаний.

Это код, который я написал в MATLAB:

x=randi(6,1,5000); %Generate 5000 random values from 1-6

mean_x = mean(x);    %Find expected value
std_x = std(x);      %Find standard deviation

range_x = [1:6];

bar(range_x, pmf);    %plot the pmf

xlabel('Value of face')
ylabel('Simulated probability mass function')

fprintf('The expected value is %4.2f\n',mean_x);
fprintf('The standard deviation is %4.2f\n', std_x);


function pmf=finitepmf(sx,px,x) %function that finds pmf

    pmf=zeros(size(x(:))); 

    for i=1:length(x) 
        switch x(i)
            case 1 
                px = 0.2;
            case 2 
                px = 0.2;
            case 3 
                px = 0.2;
            case 4 
                px = 0.2;
            case 5 
                px = 0.1;
            case 6 
                px = 0.1;
        end
        pmf(i)= sum(px(find(sx==x(i)))); 
    end

end

Однако я получаю то же самое pmf Я бы, если бы умереть было справедливо.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Это гораздо менее общее решение, чем randsample Луиса, но оно довольно простое, и я надеюсь, что чему-то научит.

Поскольку все ваши вероятности приятно округлены до 10%, вы можете перевести справедливое10-гранный кубик к недобросовестному 6-гранному кубику упражнения:

map = [1,1,2,2,3,3,4,4,5,6];

Этот map переведет целое число 1-10 в целое число 1-6, где 1-4 все имеют двойное числошанс быть выбранным, чем 5-6.

Теперь нарисуйте 5000 случайных целых чисел 1-10 и сопоставьте их:

x = map(randi(10,1,5000));

По сравнению с честным 6-сторонним кубиком:

y = randi(6,1,5000);
hx = hist(x,1:6);
hy = hist(y,1:6);

Понятно:

hx = [ 988  1029  1022   967   505   489 ]
hy = [ 827   884   833   771   849   836 ]
0 голосов
/ 28 сентября 2018

Если у вас есть набор инструментов статистики (и машинного обучения), используйте randsample с указанными весами:

result = randsample(6, 5000, true, [.2 .2 .2 .2 .1 .1]);

Проверка:

histogram(result)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...