今、100人の人がいて、そのうちの1人が風邪をひいています。
感染率をAとして、10日間経過する間にどのくらいの人が風邪をひくのか乱数を用いてシミュレーションしたいのですが、どのようにすればいいのかわかりません。このとき各個人が風邪を引く確率をA×(前日に風邪をひいている人数)とします。
感染率は最初に打ち込むんですが、例えば0.1とうちます。
そうすると初日に風邪を引いているのは1人なので次の日に各個人が風邪を引く確率も0.1になります。
このとき、99人のうち何人が風邪を引くのかという人数の算出方法がわかりません。どうやらDeseaseという関数を使うらしいのですが^^;
それと、このときまずはじめに要素を100個持つ配列を宣言し、1つの要素以外はすべて0で初期化するっぽいのですがこのやり方もわかりません^^;
よければ教えてください!!
No.1
- 回答日時:
> 99人のうち何人が風邪を引くのかという人数の算出方法がわかりません。
0. Aを入力する
1. 配列 data[100] を用意し、data[0] = 1, data[1..99] = 0 とする
2. data[0..99] のうち、1であるものの数Nを数える。
3. 風邪をひく確率 p = N×A
4. i = 0 .. 99 に対し、
4.1 data[i] = 1 なら何もしない
4.2 data[i] = 0 かつ 0~1の乱数 < p なら data[i] = 1 とする
5 2,3,4を10回繰り返す
> このときまずはじめに要素を100個持つ配列を宣言し、1つの要素以外はすべて0で初期化するっぽいのですがこのやり方もわかりません
そのくらい調べなさい。
この回答への補足
2のところですが、Count関数を使うんですよね?
そこがちょっとわからなくて^^;Nの設定の仕方とかがよくわからないんです・・・
No.2
- 回答日時:
>Desease
disease の間違いでない?
で、この関数を適当な引数で呼び出すと感染するかしないかを判定してくれるつくりになってるとか。
あと、
>このとき各個人が風邪を引く確率をA×(前日に風邪をひいている人数)とします。
仮にAを0.1とすると、10人以上風邪引きさんがいたら以降の感染率は 1(必ず感染)ぢゃないの? これだと。
No.3
- 回答日時:
> 2のところですが、Count関数を使うんですよね?
Count関数を"あなたが作る"のでしたらYES.
C/C++にはCountなんて標準関数は"ありません"
> Nの設定の仕方とかがよくわからないんです・・・
1. N = 0
2. i = 0 .. 99 に対し、data[i] == 1 なら Nに1を加える
これだけのこと。なにがわからんのかさっぱりわからん。
No.4
- 回答日時:
あまり良くないとは思ったのですが、C言語の理解が不十分なようですので、ソースコードを載せます。
コメントを細かく書いておきましたので、読んで理解に努めてください。
(バグがあるかもしれませんが、それを取り除くのも練習です。)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int NUM = 100; // 人数
const int DATE = 10; // 実験日数
const int HEALTHY = 0; // 健常者
const int INFECTED = 1; // 感染者
/*
配列の初期化
@param people 人間配列
@param num 人数
*/
void init(int* people , int num)
{
int i;
people[0] = INFECTED;
for(i=1 ; i<num ; i++)
{
people[i] = HEALTHY;
}
}
/*
感染者数を数える
@param people 人間配列
@param num 人数
@return 感染者数
*/
int infectee_count(int* people , int num)
{
int i;
int infected = 0;
for(i=0 ; i<num ; i++)
{
if(people[i] == INFECTED)
{
infected++;
}
}
return infected;
}
/*
@param people 人間配列
@param num 人数
@param initial_prob 初期感染率
*/
void disease(int* people , int num , double initial_prob)
{
int i;
double p = initial_prob * infectee_count(people , num);
for(i=0 ; i<num ; i++)
{
if(people[i] == INFECTED) // 既に感染している
{
continue;
}
double rand_val = (double)rand() / (double)RAND_MAX; // 0~1の乱数を得る
if(rand_val < p)
{
people[i] = INFECTED;
}
}
}
/*
感染シミュレート
@param num 人数
@param date 日数
*/
void simulate(int num , int date)
{
int i;
double initial_prob;
// 配列の確保
int* people = (int*)malloc(sizeof(int) * num);
if(people == NULL)
{
perror("simulate");
exit(EXIT_FAILURE);
}
// 初期感染率の入力
printf("infection probability > ");
scanf("%lf" , &initial_prob);
srand(time(NULL));
init(people , num);
// 指定の日数、実行する
for(i=0 ; i<date ; i++)
{
disease(people , num , initial_prob);
printf("%d %d\n" , i , infectee_count(people , num)); // 経過日数、感染者数を表示
}
free(people);
}
int main(void)
{
simulate(NUM , DATE);
return 0;
}
No.5
- 回答日時:
>いろいろ試したんですが、Countのところで宣言の構文エラーと出てしまいます。
>何がいけないんでしょうか?
"Count"という宣言はありませんが…
エラーメッセージをそのまま載せてもらえますか?
プログラムを作成している環境(OS,コンパイラ等)も合わせて
提示していただけると、早期解決に結びつくと思います。
この回答への補足
OSはWindowsで、BCC Developerというソフトを使っています。
int ~_count~のところで「宣言の構文エラー」とでました。
それと、HKBさんが書かれた、int ~_count(int* ~ , int ~)の部分で、コンパイルすると「)がありません」というエラーがでて、
int N_count)(int* Score[SIZE] , int SIZE)とすると「宣言の構文エラー」とでました。
No.6ベストアンサー
- 回答日時:
void diseaseを微修正しました。
こちらのBCC Developerではこれで正常にコンパイル、実行が可能です。
これでいかがでしょうか。
(再度の確認となりますが、エラーメッセージは要約せずに「そのまま」載せていただいた方がこちらとしては助言をしやすいです。)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int NUM = 100; // 人数
const int DATE = 10; // 実験日数
const int HEALTHY = 0; // 健常者
const int INFECTED = 1; // 感染者
/*
配列の初期化
@param people 人間配列
@param num 人数
*/
void init(int* people , int num)
{
int i;
people[0] = INFECTED;
for(i=1 ; i<num ; i++)
{
people[i] = HEALTHY;
}
}
/*
感染者数を数える
@param people 人間配列
@param num 人数
@return 感染者数
*/
int infectee_count(int* people , int num)
{
int i;
int infected = 0;
for(i=0 ; i<num ; i++)
{
if(people[i] == INFECTED)
{
infected++;
}
}
return infected;
}
/*
@param people 人間配列
@param num 人数
@param initial_prob 初期感染率
*/
void disease(int* people , int num , double initial_prob)
{
int i;
double p = initial_prob * infectee_count(people , num);
double rand_val;
for(i=0 ; i<num ; i++)
{
if(people[i] == INFECTED) // 既に感染している
{
continue;
}
rand_val = (double)rand() / (double)RAND_MAX; // 0~1の乱数を得る
if(rand_val < p)
{
people[i] = INFECTED;
}
}
}
/*
感染シミュレート
@param num 人数
@param date 日数
*/
void simulate(int num , int date)
{
int i;
double initial_prob;
// 配列の確保
int* people = (int*)malloc(sizeof(int) * num);
if(people == NULL)
{
perror("simulate");
exit(EXIT_FAILURE);
}
// 初期感染率の入力
printf("infection probability > ");
scanf("%lf" , &initial_prob);
srand(time(NULL));
init(people , num);
// 指定の日数、実行する
for(i=0 ; i<date ; i++)
{
disease(people , num , initial_prob);
printf("%d %d\n" , i , infectee_count(people , num)); // 経過日数、感染者数を表示
}
free(people);
}
int main(void)
{
simulate(NUM , DATE);
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 子育て 保育園に通い始めて、1年経っても風邪を引きやすい、風邪が長引くのは免疫不全の可能性が高いと思いますか 5 2023/05/19 11:36
- その他(悩み相談・人生相談) こういう人って、一体どういう人? 1 2022/10/24 06:50
- 風邪・熱 2人以上で風邪を引くと一番最初に症状が出た人が悪いのでしょうか? 友だちとお泊まり会してて自分が先に 1 2023/05/06 19:30
- その他(悩み相談・人生相談) これは、どういう人?? 2 2022/10/24 14:34
- 幼稚園・保育所・保育園 保育園や幼稚園に入園したら、最初は風邪を引きやすいと思いますが、入園して何ヶ月または何年くらい経って 1 2023/05/19 13:58
- 幼稚園・保育所・保育園 子供が幼稚園や保育園に通い始めたら風邪を引きやすいと聞きますが、実際にはどれくらい休むようになります 3 2022/05/16 22:22
- 犬 犬の風邪 犬はどうやって風邪をひくのですか?人間と同じで、外や犬との触れ合いでウィルスや菌をもらうん 1 2022/03/26 22:51
- 子供の病気 子供が風邪をひきました。 息子が風邪を引いて、病院に行きました。 医者は夏風邪かもしれない。と言いま 1 2023/08/28 13:53
- 政治 コロナが個人の判断に委ねるようになってから、ロクな事がありません。私も友人も2回風邪を引きました。 1 2023/06/13 00:14
- 風邪・熱 薄着の人にそんな格好「風邪ひくよ」。 寒い日にシャワーしたら「風邪ひくよ」。 風邪はそもそもウイルス 4 2022/10/01 06:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
比較回数と交換回数表示について
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 配列と関数の練習問題
-
c言語
-
std::set<int> で、ある値が何...
-
卒業研究でよく分からないとこ...
-
C言語 エラーの原因がわからな...
-
DLLをGetProcAddress()で実行で...
-
【C++】関数ポインタの使い方
-
read関数をノンブロッキングで...
-
C言語における対称行列の作り方...
-
構造体の勉強中です 合計点の高...
-
C言語です。
-
C言語での引数の省略方法
-
困ってます…nCrを求めるC言語...
-
C++でvectorにテキストファイル...
-
プログラミング
-
素数 再帰関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報