1

これは、2 つの 6 面サイコロが投げられることをシミュレートするために書かれています。しかし、10回投げると、ランダムに好きなだけ投げます(4、5、6など)。何か不足していますか?

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

int throwDice()                // returns random number ranged 2-12
{
    int x = (rand() % 11) + 2;
    return x;
}


int main()
{
    srand (time(NULL));
    int y;
    cout << "Roll dice how many times?" << endl;
    cin >> y;

    int a2 = 0;
    int a3 = 0;
    int a4 = 0;
    int a5 = 0;
    int a6 = 0;
    int a7 = 0;
    int a8 = 0;
    int a9 = 0;
    int a10 = 0;
    int a11 = 0;
    int a12 = 0;

    for (int i = 0; i < y; i++)
    {
        throwDice();

    if (throwDice() == 2)
        a2++;
    else if (throwDice() == 3)
        a3++;
    else if (throwDice() == 4)
        a4++;
    else if (throwDice() == 5)
        a5++;
    else if (throwDice() == 6)
        a6++;
    else if (throwDice() == 7)
        a7++;
    else if (throwDice() == 8)
        a8++;
    else if (throwDice() == 9)
        a9++;
    else if (throwDice() == 10)
        a10++;
    else if (throwDice() == 11)
        a11++;
    else if (throwDice() == 12)
        a12++;
    }
    cout << "2 = " << a2 << endl;
    cout << "3 = " << a3 << endl;
    cout << "4 = " << a4 << endl;
    cout << "5 = " << a5 << endl;
    cout << "6 = " << a6 << endl;
    cout << "7 = " << a7 << endl;
    cout << "8 = " << a8 << endl;
    cout << "9 = " << a9 << endl;
    cout << "10 = " << a10 << endl;
    cout << "11 = " << a11 << endl;
    cout << "12 = " << a12 << endl;

    system("pause");
}
4

4 に答える 4

6
  • スローを生成するために1回呼び出し(正しい)、ステートメントthrowDice()内の評価されたすべての条件で再度呼び出しています(間違っています)。ifスローの結果を変数に保存し、その変数をチェックで使用します。

  • throwDiceこの関数は、 2 つの 6 面サイコロが投げられることをシミュレートしませんが、1 つの 11 面サイコロ (2 ~ 11 の数字が印刷されている) が投げられることをシミュレートしますそれは違いを生む。(ただし、これはプログラミングの問題ではなく、数学的な問題です。その背後にある数学を理解すれば、関数を修正するのは簡単です。)

于 2013-02-16T08:47:30.877 に答える
2

代わりにこのコードを書きます:

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

int throwDice()                // returns random number ranged 2-12
{
    int x = (rand() % 11) + 2;
    return x;
}

int main()
{
    srand (time(NULL));
    int y;
    cout << "Roll dice how many times?" << endl;
    cin >> y;
    int total[13];
    for( int i = 2; i <= 12; i++ )
        total[i] = 0;

    for (int i = 0; i < y; i++)
    {
        total[throwDice()]++;
    }

    for (int i = 2; i <= 12; i++)
        cout << i << " = " << total[i] << endl;

    system("pause");
}

はるかにシンプルで理解しやすい。

さて、ここにあなたのコードの問題があります:

すべてのステートメントthrowDiceで関数を繰り返し呼び出しています。ifループの各反復で1回呼び出すだけで、結果を保存して比較できます。比較のために毎回呼び出すべきではありません。すべての呼び出しはあなたに新しい結果を与えます。

また、私のコードでは、配列を使用するとコード全体が単純化されることがわかります。ここでは、インデックスを使用した単純な演算で回避できる2つの配列要素(0と1)を無駄にしています。

于 2013-02-16T08:55:11.057 に答える
1

ループは次のようになります

int result;
for (int i = 0; i < y; i++)
{
    result = throwDice();

if (result == 2)
    a2++;
else if (result == 3)
    a3++;
else if (result == 4)
    a4++;
else if (result == 5)
    a5++;
else if (result == 6)
    a6++;
else if (result == 7)
    a7++;
else if (result == 8)
    a8++;
else if (result == 9)
    a9++;
else if (result == 10)
    a10++;
else if (result == 11)
    a11++;
else if (result == 12)
    a12++;
}

また、このthrowDice()機能は2つのサイコロを投げるのと同じではありません。2から12までのすべての値を振る可能性が等しい関数を作成しました。たとえば、2つのサイコロを振る場合、12よりも6を振る可能性がはるかに高くなります。 1と6を追加し、それらを追加して関数の戻り値を取得しthrowDice()ます。

于 2013-02-16T08:55:01.117 に答える
0

これが質問の答えではないことはわかっていますが、C++11 が利用可能になった場合、C++11 の恩恵を受けるのではないかと思わずにはいられませんでした。

#include <random>

std::minstd_rand prng;
std::uniform_int_distribution<int> dice (1, 6);

int throwDice ()
{
    return (dice(prng) + dice(prng));
}

int main ()
{
    prng.seed(time(NULL));

    // (code)
}
于 2013-02-16T12:12:15.547 に答える