0

2 つのサイコロを振って、合計が 7 になる前に、ロール回数の確率ヒストグラムを生成する必要があります。実験は適切に機能し、10,000 回の反復で期待どおりのデータが得られました。ただし、このデータをヒストグラムに表示するのに多くの問題があります。問題は、ヒストグラムに出力されたように見える大量の余分なデータがあり、渡したベクトルには存在しないことhist()です。これは、x 軸の大きな値で大量の無限に大きなビンとして表示されます。

合計が 7 になる確率は 6/36 = 1/6 であるため、これは最初の数回のロールの 1 つで発生するのが一般的です。ここに行ベクトル「rollbins」があり、i 番目のエントリは「i」回のロールを必要とする実験の頻度を保持します。実験を何度も繰り返した後、rollbins の最初のいくつかの要素は大きくなり、その後の各エントリは小さくなり、45 番目の要素は通常ゼロになります。

hist()bins ベクトル引数を指定して関数を使用しました。この質問に従ってxlim()、表示を x 軸で 0 ~ 45 に制限していました。ただし、出力は の有無に限定されませんxlim()

どんな助けでも大歓迎です:)

iters = 1000;
% do not consider extreme results
maxrolls = 45;
% rollbins(i) is how many experiments occured with i rolls
rollbins = zeros(1, maxrolls);

for r=1 : 1 : iters
    % roll die until get sum of 7, note times taken
    sum = 0;
    % the amount of rolls the experiment takes
    rolls = 0;
    while sum ~= 7
        rolls = rolls + 1;
        % sum two rolls of a die (same as one roll two dies)
        sum = floor( 6*rand(1) + 1 ) + floor( 6*rand(1) + 1 );
    end

    % assign if within the vector's limits; discards outliers
    if rolls < maxrolls
        rollbins(rolls) = rollbins(rolls) + 1;
    end
end

% 1,2,3...45
range = 1:1:maxrolls;
% limit the values on x-axis to 0-45
xlim([0 maxrolls]);
% the histogram shows more than 45 vertical bars
hist(rollbins, range)

編集:xlim()呼び出しは関数の後に来る必要がありhist()ます。最後のグラフィックス関数 ( ) のセミコロンを省略すると、ylimこれらの効果が発生します。

hist(rollbins, range);
xlim([0 maxrolls-1]);
ylim([0 iters / 5])

しかし、バーがまだ短すぎて、ビンが予想どおり 1 ではなく .1 の間隔で表示されることに気付きました。

4

3 に答える 3

1

ロール カウントの頻度を記録していますが、ロール カウント自体を記録してから、ヒストグラムに頻度を表示させる必要があります。

また、ヒストグラムを生成した後に (前ではなく) xlim を適用する必要があります。

rollbins = zeros(1, maxrolls);
numberofrolls = [];   % Initialise numberofrolls

if rolls < maxrolls
    rollbins(rolls) = rollbins(rolls) + 1;
    numberofrolls (end+1) = rolls;  % Record # of rolls
end

hist(numberofrolls);    % Generate histogram
于 2012-06-04T02:55:18.043 に答える
0

このシミュレーションを実装する方法は次のとおりです。

iters = 1000;               %# number of times to run simulation
maxrolls = 45;              %# max number of rolls to consider
numRolls = nan(iters,1);    %# store number of rolls in each run
for r=1:iters
    %# rolls dice "maxrolls"-times, and compute the sums
    diceSums = sum(randi([1 6],[maxrolls 2]), 2);

    %# find the first occurence of a sum of 7
    ind = find(diceSums==7, 1, 'first');

    %# record it if found (otherwise noted as NaN)
    if ~isempty(ind)
        numRolls(r) = ind;
    end
end

%# compute frequency of number of rolls, and show histogram
counts = histc(numRolls, 1:maxrolls);
bar(1:maxrolls, counts, 'histc'), grid on
xlabel('Number of dice rolls to get a sum of 7')
ylabel('Frequency')
xlim([1 maxrolls])

スクリーンショット

あなたが少し冒険を感じているなら、ここに大きなループの完全にベクトル化されたバージョンがあります:

numRolls = cellfun(@(v) find(v,1,'first'), ...
    num2cell(sum(randi([1 6],[iters maxrolls 2]),3) == 7, 2), ...
    'UniformOutput',false);
numRolls(cellfun(@isempty,numRolls)) = {NaN};
numRolls = cell2mat(numRolls);
于 2012-06-04T16:17:08.367 に答える
0

これが私が最終的に得た解決策でした(私はまだベクトル化にあまり慣れていません)

iters = 10000;
% preallocation of experiments row vector, one element for every experiment
experiments = zeros(1,iters);
for i=1 : 1 : iters
    % roll die until get sum of 7, note times taken
    sum = 0;
    rolls = 0;
    while sum ~= 7
        rolls = rolls + 1;
        sum = floor(6*rand(1)+1) + floor(6*rand(1)+1);
    end

    % save the number of rolls this experiment took
    experiments(i) = rolls;
end

% do not plot experiments that took more than 50 rolls
bins = 0:1:50;
hist(experiments, bins);
xlim([0 50]);
ylim([0 1750])
于 2012-06-05T21:50:08.810 に答える