🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1071閲覧

ループ処理での乱数生成

encho

総合スコア182

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/11/29 01:18

編集2020/11/29 23:57

ループ処理での乱数生成

現在モンティーホール問題を実装していますが、ループ処理のところで全て同じ値になってしまいます。

モンティホール問題

実装

以下のようなコードを書いています。
forでのループ処理で都度乱数を生成して各ループで異なる結果を出したいのですが、
出力がwin_count = 10000, lose_count = 0
のようになってしまいます。おそらく1度目の結果をそのまま返してしまっています

記載コードはドアを変えない場合のシミュレーションです。

C++

1#include<iostream> 2#include <stdlib.h> // rand, srand関数 3#include <time.h> // time関数 4using namespace std; 5 6// 0:ひつじ, 1:くるま 7int door[3] = {0, 0, 1}; 8int choose_num; 9int win_count = 0; 10int lose_count = 0; 11 12// ドアを開ける 13int choose_door() { 14 // 乱数を生成してreturn 15 unsigned int now = (unsigned int)time( 0 ); 16 srand(now); 17 return rand() % 3; 18} 19 20// ひつじのドアを開ける 21int releave_door() { 22 int n; 23 for(int i=0; i<3; i++) { 24 if(door[i] == 1 || i == choose_num) continue; 25 n = i; 26 } 27 return n; 28} 29 30// ドアを変えなかった場合 31void not_change_door_result() { 32 if(door[choose_num] == 1) win_count++; 33 else lose_count++; 34} 35 36int main() { 37 // 試行回数10000回で実験 38 for(int i=0; i<10000; i++) { 39 choose_num = choose_door(); 40 int sheep_door = releave_door(); 41 not_change_door_result(); 42 } 43 cout << win_count << " " << lose_count << endl; 44}

## 質問
ループの度に異なる乱数を生成して、正しいシュミレーションを行いたいです。
アドバイスをよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/11/29 01:32

× シュミレーション 〇 シミュレーション
episteme

2020/11/29 01:36

必要な変数をなんもかんもグローバルにするのはお行儀悪い。
guest

回答3

0

ベストアンサー

choose_doorに以下の記述がありますが、このままだとchoose_doorを呼び出すたびに、疑似乱数のシードが現在日時に基づいて設定されます。

C

1 unsigned int now = (unsigned int)time(0); 2 srand(now);

すると、現在時刻が同じ秒数の間は、同じシードが設定されるため、最初のrand()で得られる値は同一になります。現実的に、現在のPCの処理速度では1秒間にすべての試行(10000回)が終了してしまうため、(途中で秒数が変わらなければ)すべて同一のrand()の返り値でシミュレーションが行なわれ、同一の結果が10000個得られることになります。

解決策は、他の方の回答にあるように、シードの設定をmainの冒頭で行ない、choose_doorではrand()だけを行なうことです。

投稿2020/11/29 01:39

編集2020/11/29 04:00
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

c

1 unsigned int now = (unsigned int)time( 0 ); 2 srand(now);

をmainの頭に移動するとよいと思います。

投稿2020/11/29 01:32

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

unsigned int now = (unsigned int)time( 0 );
srand(now);

seedの設定↑はmainのアタマで一回だけ。

投稿2020/11/29 01:31

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問