rand関数を使ったシミュレーション

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
低能です

rand関数を使ったシミュレーション

#1

投稿記事 by 低能です » 8年前

箱の中に赤玉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;
}


このようにプログラムを作ったのですが、-などとんでもく大きかったり小さかったりする数字が出力されます。
どこが違うのでしょうか?

一応コインの表裏の確立をシミュレーションするプログラムを参考にしました。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: rand関数を使ったシミュレーション

#2

投稿記事 by みけCAT » 8年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
低能です さんが書きました:このようにプログラムを作ったのですが、-などとんでもく大きかったり小さかったりする数字が出力されます。
どこが違うのでしょうか?
まず、あってはいけない場所に全角スペースがあるので、一部のコンパイラでしかコンパイルが通らないでしょう。
次に、printf関数に渡す書式とデータの対応が間違っているので、未定義動作になります。
(double)u/nなどはdouble型なので、%fなどの浮動小数点数を出力する書式を使用するべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: rand関数を使ったシミュレーション

#3

投稿記事 by みけCAT » 8年前

また、このkyu関数では、0が約0.2、1が約0.5-0.2=0.3、2が約1-0.5=0.5の確率で返ります。
説明文と比較して確率と色の対応が違っています。
u, v, wという意味不明な変数名ではなく、red, green, blueなどのわかりやすい変数名を使用するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

低能です

Re: rand関数を使ったシミュレーション

#4

投稿記事 by 低能です » 8年前

そうやってコード書けばいいんですね、本当にすいません。


アドバイスありがとうございます!!
おかげでプログラムがうまく起動できました。

いろいろとありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る