0

私はいくつかの C++ の練習を行っており、10000 回の試行後にサイコロの組み合わせが転がった回数をカウントするプログラムを作成しようとしています。可能なすべてのダイスの組み合わせを格納するために 2D 配列を使用しました。10000 を実行rand()%6+1し、ランダムなメモリ割り当ての値をインクリメントします。

これは私の試みです。

cout << "\nDice roll analyser" << endl;

const int first = 6;
const int second = 6;
int nRolls[first][second];
int count = 0;

while (count < 10000){
    nRolls[rand()%6+1][rand()%6+1]+=1;
    count++;
}

for (int i=0;i<first;i++){
    for (int j=0;j<second;j++){
        cout << nRolls[i][j] << " ";
    }
}

これは私が得た出力です。

0 0 0 0 0 0 0 269 303 265 270 264 228 289 272 294 290 269 262 294 303 277 265 294 288 266 313 274 301 245 317 276 292 2820 264

私が達成しようとしているのは、各組み合わせがロールされる回数です。たとえば、1、6 がロールされる回数などです。

4

3 に答える 3

6

を更新することはありませんcount

コード セグメントを n 回実行したい場合 (現在は n = 10000)、これが一般的な方法です。

for (int i = 0; i < 10000; ++i)
{
    //loop code.
}

さらに、myVariable+=1いつでも or のいずれかに単純化できます++myVariable(myVariable++割り当て時に myVariable の値を正しく使用しない場合は、最初の値を使用することをお勧めします。プリ/ポスト インクリメントの詳細については、http: //gd.tuwien.ac.at/languages/c/programming-bbrown/c_015.htm

代わりに、nRolls[rand()%6+1][rand()%6+1]+=1; 代わりに行うことができます

++(nRolls[rand()%6+1][rand()%6+1]);

さらに、配列のインデックスはゼロです。つまり、最初の配列である配列の位置を除外して値rand()%6+1を制限しているため、代わりに単に使用することを検討してください。160

++(nRolls[rand()%6][rand()%6]);

次に、(i,j) (i と j は 1 から 6 の間) をロールする頻度を調べるには、

cout << "(" << i << "," << j << "):" << nRolls[i-1][j-1] << endl;
于 2012-06-07T14:11:05.010 に答える
4

+1 を rand()%6 に追加しているため、ここで問題が発生します。インデックス 0 の要素のカウントをインクリメントすることはありません。インクリメントできる最小要素インデックスは 1 から始まります。

于 2012-06-07T14:12:35.280 に答える
1

わかりました、助けてくれてありがとう。これは、正しく表示される更新されたコードです。

cout << "\nDice roll analyzer" << endl;

srand(time(0));

const int first = 6;
const int second = 6;
int nRolls[first][second];
int count = 0;

while (count < 10000){
    nRolls[rand()%6][rand()%6]++;
    count++;
}

for (int i=0;i<first;i++){
    for (int j=0;j<second;j++){
        cout << "(" << i+1 << "," << j+1 << ")" << nRolls[i][j] << endl;
    }
}
于 2012-06-07T14:33:17.437 に答える