[解決済み] サイコロ2個を1000回振る
質問内容
教授から、以下のようなプログラムを書くように言われました。
-
ループを使って、サイコロを1000回振るシミュレーションを行う(ここではforループが有効だと思う)。
-
各反復で、ループは2から12までの各値の回数を数える必要があります(ここではif/else文が適用されると考えています)。
-
ループ終了時に、各値(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;
}
}
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み] std::stringをintに変換するにはどうしたらいいですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】浮動小数点数の乱数生成