箱の中に赤玉2、緑玉5、青玉3個がある。箱の中から球を取り出して色を記録した後、箱に戻す。この操作をN会繰り返して行い、各色の出現割合0.2,0.5,0.3をrand関数を用いてシミュレーションで確認せよ。
という問題です。
#include<stdio.h>
#include<stdlib.h>
int kyu(void);
int main(void)
{
int i, n, u, v, w, res;
printf("球を取り出す回数:");
scanf("%d",&n);
u = v = w = 0;
for(i = 0;i < n;i++){
res = kyu();
if(0 == res) u++;
else if(1 == res) v++;
else w++;
}
printf("赤:%d,緑:%d,青:%d\n",(double)u/n,(double)v/n,(double)w/n);
return 0;
}
int kyu(void)
{
float a;
a = (double)rand() / RAND_MAX;
if(a < 0.2) return 0;
else if(a < 0.5) return 1;
else return 2;
}
このようにプログラムを作ったのですが、-などとんでもく大きかったり小さかったりする数字が出力されます。
どこが違うのでしょうか?
一応コインの表裏の確立をシミュレーションするプログラムを参考にしました。
rand関数を使ったシミュレーション
Re: rand関数を使ったシミュレーション
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
次に、printf関数に渡す書式とデータの対応が間違っているので、未定義動作になります。
(double)u/nなどはdouble型なので、%fなどの浮動小数点数を出力する書式を使用するべきです。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
まず、あってはいけない場所に全角スペースがあるので、一部のコンパイラでしかコンパイルが通らないでしょう。低能です さんが書きました:このようにプログラムを作ったのですが、-などとんでもく大きかったり小さかったりする数字が出力されます。
どこが違うのでしょうか?
次に、printf関数に渡す書式とデータの対応が間違っているので、未定義動作になります。
(double)u/nなどはdouble型なので、%fなどの浮動小数点数を出力する書式を使用するべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: rand関数を使ったシミュレーション
また、このkyu関数では、0が約0.2、1が約0.5-0.2=0.3、2が約1-0.5=0.5の確率で返ります。
説明文と比較して確率と色の対応が違っています。
u, v, wという意味不明な変数名ではなく、red, green, blueなどのわかりやすい変数名を使用するといいでしょう。
説明文と比較して確率と色の対応が違っています。
u, v, wという意味不明な変数名ではなく、red, green, blueなどのわかりやすい変数名を使用するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: rand関数を使ったシミュレーション
そうやってコード書けばいいんですね、本当にすいません。
アドバイスありがとうございます!!
おかげでプログラムがうまく起動できました。
いろいろとありがとうございました。
アドバイスありがとうございます!!
おかげでプログラムがうまく起動できました。
いろいろとありがとうございました。