2

RollDiceと呼ばれる私の関数は、指定された回数の6面サイコロの回転をシミュレートします。この関数には2つの入力引数があります。各実験でサイコロが振られる回数(NumDice)と、サイコロが振られる合計回数(NumRolls)です。関数の出力は、各実験のサイコロの値の合計を含む長さNumRollsのベクトルSumDiceになります。

これは今の私のコードです:サイコロの合計をどのように説明しますか?ありがとう!

function SumDice= RollDice(NumDice,NumRolls)

FACES= 6;               
maxOut= FACES*NumDice;         
count= zeros(1,maxOut);  


for i = 1:NumRolls

    outcome= 0;  
    for k= 1:NumDice
        outcome= outcome + ceil(ranNumDice(1)*FACES);
    end

    count(outcome)= count(outcome) + 1;
end


bar(NumDice:maxOut, count(NumDice:length(count)));
message= sprintf('% NumDice rolls of % NumDice fair dice',  NumRolls, NumDice);
title(message);
xlabel('sum of dice values');  ylabel('Count');
4

1 に答える 1

4

これは単純できちんとした小さな問題(+1)であり、私はそれを調べるのを楽しんだ:-)

私があなたの機能を改善することができると私が感じたかなりの数の領域がありました。それらを1つずつ確認するのではなく、関数を自分のやり方で書き直して、そこから実行できると思いました。スクリプトとして作成しましたが、簡単に関数に変換できます。最後に、サイコロに任意の数の面(6またはそれ以外)を持たせることで、少し一般化しました。だから、ここにあります:

%#Define the parameters
NumDice = 2;
NumFace = 6;
NumRoll = 50;

%#Generate the rolls and obtain the sum of the rolls
AllRoll = randi(NumFace, NumRoll, NumDice);
SumRoll = sum(AllRoll, 2);

%#Determine the bins for the histogram
Bins = (NumDice:NumFace * NumDice)';

%#Build the histogram
hist(SumRoll, Bins);
title(sprintf('Histogram generated from %d rolls of %d %d-sided dice', NumRoll, NumDice, NumFace));
xlabel(sprintf('Sum of %d dice', NumDice));
ylabel('Count');

私のコードと、私が使用した各関数のドキュメントをよく見てください。この演習は、将来、Matlabで他の問題に取り組むときに役立つ場合があります。それが終わったら、わからないことがあればコメントで教えてください。お手伝いさせていただきます。乾杯!

ps、個々のロールを再度参照する必要がない場合は、もちろん、AllRollandSumRoll行を1つのライナーに変換できますSumRoll = sum(randi(NumFace, NumRoll, NumDice), 2);。個人的には2ライナーの方が読みやすいと思いますが、コードの効率に大きな違いがあるとは思えません。

于 2012-11-21T04:19:30.097 に答える