• 締切済み

C言語 プログラム 確率

今、学校の授業で病気の感染プログラムを作っています。 内容は、 ・3カテゴリー(0:健康体、1:感染者、2:免疫体)の人間がいる。 ・2カテゴリー(0:病原体を持たない蚊、1:病原体ウイルスを持つ蚊)の蚊がいる。 ・人間と蚊がxy座標上をある速度でランダムに移動している。 ・健康体の人間とウイルスを持った蚊と人間ある一定距離内にいると蚊が人間を刺して病気が感染し、人間が0:健康体から1:感染者に変化する。 簡単に言いましたが、このようなプログラムを作っています。 その中で、人間に感染する部分のプログラムを下に載せます。 double c0x, c0y, ax, ay, bx, by; for(i=0; i<N;++i){ if(b[i].category==1){ c0x=(*cat0ka).coord.x; c0y=(*cat0ka).coord.y; ax=a[i].coord.x; ay=a[i].coord.y; bx=b[i].coord.x; by=b[i].coord.y; if(((c0x-ax)*(c0x-ax)+(c0y-ay)*(c0y-ay))<R){ (*cat0agent).category=1; } else if(a[i].category==1){ c0x=(*cat0agent).coord.x; c0y=(*cat0agent).coord.y; ax=a[i].coord.x; ay=a[i].coord.y; bx=b[i].coord.x; by=b[i].coord.y; if(((c0x-bx)*(c0x-bx)+(c0y-by)*(c0y-by))<R){ (*cat0ka).category=1; return ; } } int t; for(t=1; 7-t;++t ){ if((*cat0agent).category=1){ if(6<t){ (*cat0agent).category=2; } } } (*cat0agent).coord.x+=(frand()-0.5); (*cat0agent).coord.y+=(frand()-0.5); (*cat0ka).coord.x+=(frand()-0.5); (*cat0ka).coord.y+=(frand()-0.5); } } } このプログラムでは、一定距離内にいると100%感染するようになっていますが、 それを、"一定距離内にいると30~50%の確率で感染する"という条件に変えたいと思っていますが、そのやり方がわかりません。 どなかか分かりやすく丁寧に教えていただけませんか? お願いします。 ちなみに感染率は今30%で考えてもらえれば良いです。 載せたプログラム自体も完成しきれていないので、わからないかもしれません。 すみません。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ついでに: ・a とか b とかの配列は何を意味する? ・if(((c0x-ax)*(c0x-ax)+(c0y-ay)*(c0y-ay))<R) や if(((c0x-bx)*(c0x-bx)+(c0y-by)*(c0y-by))<R) って条件は間違ってる可能性がある.

回答No.1

http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html#Prepare_rand >"一定距離内にいると30~50%の確率で感染する"という条件に変えたい その場合は、まず、rand関数で「0~20」の範囲の乱数を発生させ、発生した乱数に「30」を加算し「30~50」の値を作る。 次に「0~100」の値の乱数をrand関数で作り、最初に求めた「30~50の乱数」より大きいか否かを検査し、大きくない(小さいか等しい、つまり「以下」)なら感染、大きいなら感染しない、と処理する。 >ちなみに感染率は今30%で考えてもらえれば良いです。 その場合は「0~100」の値の乱数をrand関数で作り「30以下」かを検査し、大きくない(小さいか等しい、つまり「以下」)なら感染、大きいなら感染しない、と処理する。 以下、蛇足。 c0x=(*cat0ka).coord.x; c0y=(*cat0ka).coord.y; (*cat0agent).category=1; (*cat0ka).category=1; (*cat0agent).category=2; (*cat0agent).coord.x+=(frand()-0.5); (*cat0agent).coord.y+=(frand()-0.5); (*cat0ka).coord.x+=(frand()-0.5); (*cat0ka).coord.y+=(frand()-0.5); などの「構造体のポインタのメンバ参照や代入」は c0x=cat0ka->coord.x; c0y=cat0ka->coord.y; cat0agent->category=1; cat0ka->category=1; cat0agent->category=2; cat0agent->coord.x+=(frand()-0.5); cat0agent->coord.y+=(frand()-0.5); cat0ka->coord.x+=(frand()-0.5); cat0ka->coord.y+=(frand()-0.5); のように「->(アロー演算子)」で可能。 あと int t; for(t=1; 7-t;++t ){ if((*cat0agent).category=1){ if(6<t){ (*cat0agent).category=2; } } } は何をしたいのだろうか? この処理をすると、必ず「感染者」になると思うが? if((*cat0agent).category=1){ は「1を代入して、1が非0ならば真」なので、必ず1が代入され、必ず成り立つぞ。

関連するQ&A