1. ホーム
  2. c++

[解決済み] サイコロ2個を1000回振る

2022-02-10 08:32:27

質問内容

教授から、以下のようなプログラムを書くように言われました。

  1. ループを使って、サイコロを1000回振るシミュレーションを行う(ここではforループが有効だと思う)。

  2. 各反復で、ループは2から12までの各値の回数を数える必要があります(ここではif/else文が適用されると考えています)。

  3. ループ終了時に、各値(2〜12)が発生した回数を表示すること。

彼は課題をこのように構成しています。

彼は、1000回のforループに入る関数を使って、関数呼び出しごとに別の関数を2回呼び出すことを望んでいます(2つのサイコロが投げられるのをシミュレートするため)。

私が何とか書き留めたものを説明しましょう。

//
//  main.cpp
//  RollingDice

#include <iostream>
#include <ctime>
using namespace std;
int roll();
int rollDice();

int main(int argc, const char * argv[])
{

    for (int i = 1; i < 1000; i++)
    {

        rollDice(); //This is the function that is supposed to call the roll(); 
                    //function two times. This makes sense to me that TWO DICE 
                    //are being rolled 1000 times. 

    }

    int result; //These two statements was where I was just hoping for something 
                //to work. I put these variable statements outside of the for 
                //loop because I was thinking that the int rollDice(); function 
                //definition(below) wouldn't know how to use it otherwise. I 
                //know that doesn't make sense, but I just can't explain why. 

    result = rollDice();

}

int roll()
{ //This function was provided to us by my professor. 
    static bool randomInitialized = false;

    int points;

    if (!randomInitialized)
    {
        srand((unsigned int) time(NULL));
        randomInitialized = true;

    }
    points = (rand() % 6) + 1;
    return points;
}

int rollDice()
{ //This I wrote myself. I'm imagining this is how you call a function twice. 
  //The return statement in this function was my attempt of returning the sum
  //of the values of the two dice.
    roll();
    roll();

    return result;
}

この部分の他に、発生した値に対してカウンターを持たせる方法を考えています(ただし、この部分はforループに属すると想像しています。) 昨日からこのプログラムについて深く考えています。昨日からこのプログラムについて深く考えていて、今日、新鮮な気持ちで解決できるのではないかと思って戻ってきたのですが、まだ悩んでいます。どんなことでも、助けてください。

どのように解決するのですか?

式は roll() は数値として評価されます。数字を足すには + . 値を返すには return .

これをまとめると、2つのロールを合計する簡単な関数が得られます。

int rollDice() { return roll() + roll(); }

番号が振られたものが並んでいて、その番号が両方とも近くて0付近から始まっている場合、標準ライブラリの1つの SequenceContainer は、シーケンス全体を保持するのに適しています。

ここでは、特定の投擲のためのカウントを表しています。使用可能な値(2〜12まで)を前もって正確に知っているので std::array が適切です。少なくとも1000を保持できる積分値であれば、カウントとして適切である。私は std::size_t ここで

#include <array>
#include <iostream>

int main()
{
    std::array<std::size_t, 13> counts {}; 

これにより、0 の位置から始まる 13 個の 0 が得られます。

    for (std::size_t i = 0; i < 1000; ++i)
    {
         ++counts[rollDice()]; 

rollDiceでどの数字を選ぶか、それを使ってインクリメントするカウントを選択します。

    }

    for (std::size_t i = 2; i < 13; ++i)
    {

これで、結果をループしてカウントを表示することができます。

         std::cout << "The count for " << i << " is " << counts[i] << std::endl;
    }
}