Проверьте закон больших чисел в MATLAB - PullRequest
1 голос
/ 26 февраля 2020

Проблема: если выпало большое количество справедливых N кубиков, среднее значение имитированных бросков, вероятно, будет близко к среднему значению 1,2, ... N т.е. ожидаемое значение одного d ie. Например, ожидаемое значение 6-стороннего d ie равно 3,5.

. Учитывая N , имитируйте 1e8 N бросков игральных костей путем создания вектора. 1e8 равномерно распределенных случайных чисел. Вернуть разницу между средним значением этого вектора и средним целым числом от 1 до N .


Мой код:

function dice_diff = loln(N)
       % the mean of integer from 1 to N    
       A = 1:N
       meanN = sum(A)/N;
% I do not have any idea what I am doing here!
       V = randi(1e8);
       meanvector = V/1e8;
       dice_diff = meanvector - meanN;
end

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Как указывалось , более внимательно рассмотрим использование randi(). Из общего случая

X = randi([LowerInt,UpperInt],NumRows,NumColumns);  % UpperInt > LowerInt

вы можете приспособиться к броску костей, например,

Rolls = randi([1 NumSides],NumRolls,NumSamplePaths); 

. Обмен NumRolls и NumSamplePaths приведет к Rolls.' или transpose(Rolls).

В соответствии с Законом о больших числах обновленное среднее значение выборки после каждого броска должно сходиться к истинному среднему значению ExpVal (сокращение от ожидаемое значение ), по мере увеличения количества бросков (испытаний). Обратите внимание, что с увеличением NumRolls среднее значение выборки сходится к истинному среднему значению. Изображение ниже показывает это для двух примерных путей.

Top Image showing sample mean converging per Law of Large Numbers. Bottom figure showing mean error converging to zero.

Чтобы получить среднее значение выборки для каждого числа бросков кубиков, я использовал arrayfun() с

CumulativeAvg1 = arrayfun(@(jj)mean(Rolls(1:jj,1)),[1:NumRolls]);

, что эквивалентно использованию совокупной суммы, cumsum(), чтобы получить тот же результат.

CumulativeAvg1 = (cumsum(Rolls(:,1))./(1:NumRolls).');    % equivalent

% MATLAB R2019a
% Create Dice
NumSides = 6;   % positive nonzero integer
NumRolls = 200;
NumSamplePaths = 2;

% Roll Dice
Rolls = randi([1 NumSides],NumRolls,NumSamplePaths);  

% Output Statistics
ExpVal = mean(1:NumSides);
CumulativeAvg1 = arrayfun(@(jj)mean(Rolls(1:jj,1)),[1:NumRolls]);
CumulativeAvgError1 = CumulativeAvg1 - ExpVal;
CumulativeAvg2 = arrayfun(@(jj)mean(Rolls(1:jj,2)),[1:NumRolls]);
CumulativeAvgError2 = CumulativeAvg2 - ExpVal;

% Plot
figure
subplot(2,1,1), hold on, box on
    plot(1:NumRolls,CumulativeAvg1,'b--','LineWidth',1.5,'DisplayName','Sample Path 1')
    plot(1:NumRolls,CumulativeAvg2,'r--','LineWidth',1.5,'DisplayName','Sample Path 2')
    yline(ExpVal,'k-')
    title('Average')
    xlabel('Number of Trials')
    ylim([1 NumSides])
subplot(2,1,2), hold on, box on
    plot(1:NumRolls,CumulativeAvgError1,'b--','LineWidth',1.5,'DisplayName','Sample Path 1')
    plot(1:NumRolls,CumulativeAvgError2,'r--','LineWidth',1.5,'DisplayName','Sample Path 2')
    yline(0,'k-')
    title('Error')
    xlabel('Number of Trials')
1 голос
/ 26 февраля 2020

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

R = randi (IMAX, N) возвращает матрицу N-by-N, содержащую псевдослучайные целочисленные значения, взятые из дискретного равномерного распределения 1: IMAX. randi (IMAX, M, N) или randi (IMAX, [M, N]) возвращает матрицу M-by-N. randi (IMAX, M, N, P, ...) или randi (IMAX, [M, N, P, ...]) возвращают массив M-by-N-by-P-by -... Рэнди (IMAX) возвращает скаляр. randi (IMAX, SIZE (A)) возвращает массив того же размера, что и A.

Итак, если вы хотите использовать randi в своей задаче, вы должны использовать его следующим образом:

V=randi(N, 1e8,1);

и вам нужно внести еще некоторые изменения:

function dice_diff = loln(N)
%the mean of integer from 1 to N    
A = 1:N;
meanN = mean(A); 
V = randi(N, 1e8,1);
meanvector = mean(V);
dice_diff = meanvector - meanN;
end

Для решения будущих проблем попробуйте использовать команду

help randi

И Matlab объяснит, как работает функция randi (или другое функция) работает.

Убедитесь, что приведенный выше код дает желаемый результат

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