1

这是为了模拟投掷 2 个 6 面骰子而编写的。但是当我投入 10 次投掷时,它会随机投掷任意数量的 (4, 5, 6 etc.) 。我错过了什么吗?

#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
  • 您调用throwDice()一次以生成抛出(正确),然后在if语句中的每个评估条件中再次调用(不正确)。将 throw 的结果保存在一个变量中,并在您的检查中使用该变量。

  • 您的throwDice函数不模拟两个 6 面骰子被抛出,但它模拟一个 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您只需在循环的每次迭代中调用一次,存储结果并比较结果。您不应该每次都调用它进行比较。每一个电话都会给你一个新的结果。

您还可以在我的代码中看到使用数组如何简化整个代码。在这里,我浪费了两个数组元素(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 个骰子时,掷 6 的可能性远大于掷 12。您应该在两者之间创建两个数字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 回答