

1 #include <stdio.h>
2 #include <time.h>
3 #include <stdlib.h>
4 #define P 0.05
5 int main(void)
6 {
7 int abc;
8 double x;
9 srand(time(NULL));
10 x = (double)rand()/RAND_MAX;
11 if(x > P){
12 abc = 1;
13 }
・・・
(1)0から1までのランダムな実数値を10行目で発生させているつもりですが、あまりきざみが良くない?とこ耳にはさんだので0から1までの最もいいと思われるランダムな実数値の発生を教えてもらえないでしょうか?
(2)11行目で約1/20000の確率でabcに1を代入したいのですが、上記のプログラムをどのように改良すればよろしいでしょうか?
どちらか片方でもアドバイス頂ければ幸いなので、お手数ですがよろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
(1)
きざみがよくないのはintがカバーする範囲と
doubleがカバーする範囲ではdoubleの方が大きいからです。
doubleは浮動小数点8バイトintは整数値4バイト(処理系依存)ですし
※doubleは仮数部52ビット(IEEE754の場合)
当然です。ましてやVC++.net2003の場合RAND_MAXは0x7fff(2バイト以下)で
定義されているので尚更です。
しかしよほど精度を必要とする科学技術計算でもしないのなら
気にならないとおもいますが。
(2)
#define RANDOM(x) (rand()%(x))
として定義するのが一般的です。
RANDOM(10)とすると0~9までの整数が返ります。
RANDOM(20000)とすると0~19999が返ってきます。
とはいっても厳密にはRAND_MAXに影響するので1/20000ではありませんし
ANSI Cにはいっているのはrand()ぐらいしかあいません。
しかし相当な精度を必要としないのであれば普通は十分です。
自分でランダムな数値の発生させたいなら
アルゴリズムがのっている
http://www5.airnet.ne.jp/tomy/cpro/science.htm
を参考にしてください。
お礼の返事が遅くなってすみませんでした。
(1)のきざみの話ですが、doubleの方がより細かい乱数をきざめることがよく分かりました。
確かにWindowsとUNIX系だとRAND_MAXの定義違いますよね。もう一度確認しておきます。
(2)の関数マクロを使って定義するのは非常に参考になりました。
まだホームページは見てないのでこれから見て来ます。
また何か分からないことがあったらよろしくお願いします。どうもご親切にありがとうございました。
No.4
- 回答日時:
for(i=0;i<1000000;i++){
if(x > P){ abc++; }
}
上では,「計算を1000000回行って,その計算内で,x>Pならabcに1を足していく」という解釈ですよ.
**********************************************
>1/20000の確率でabcに+1していきたい
xが0~1の範囲内で同じ確率で出る(はず)ですので,
if文の箇所はやはり
if(x<=0.001*P) {abc=1;}
でいいと思われます.
とりあえず,
if(x<=0.5) {abc=1;}
あたりから始めてみてはいかがですか?
お礼の返事が遅くなりすみませんでした。
>>上では,「計算を1000000回行って,その計算内で,x>Pならabcに1を足していく」という解釈ですよ.
その通りなのですが、1000000回ループさせる内、数回if文を満たして実行させて、結果的に1/20000位の確率でabcに値が+されているという実験をしたかったのですがなかなかうまくいきませんでした。
とりあえずif(x<=0.5) {abc=1;}から始めてみたいと思います。
度々ご親切に回答して頂きありがとうございました。
No.3
- 回答日時:
(1)rand()を複数回使用する。
例えば12桁くらい欲しければ、
x = rand() % 1000 / 1e3 + rand() % 1000 / 1e6 + rand() % 1000 / 1e9 + rand() % 1000 / 1e12;
お礼の返事が遅くなってすみませんでした。
きざみの話ですが分かりやすい実例を上げて頂きありがとうございました。
再びプログラムに取り掛かっているのですが、試して見たいと思います。
また何かわからないことがありましたら宜しくお願い致します。
どうもご親切にありがとうございました。
No.1
- 回答日時:
(1)
1を含めるのでしょうか?
x=rand()/(1.0+RAND_MAX);←0<=x<1
x=rand()/(RAND_MAX);←0<=x<=1
20centuryboyさんので問題ないと思いますが….
(2)
1/20000の確率のところが?です.
#define P 0.05と,11行目のPとの関連は?
これだと「0.05よりもxが大きければ,abc=1」と解釈できますよ.
if(x<=0.001*P) {abc=1;}
ではだめですか?
「xが1/20000以下であればabcに1を代入する」
という意味ですが….
この回答への補足
早速の回答ありがとうございます。
情報が少なくてすみません、(1)では0<x<1の範囲で実数値を発生させたいと考えていました。回答とても参考になりました。またsrandに与える種次第で、xに入る値が変わってくると思うので、他にいい種があるのかなーと思って質問しました。ただ私があまり理解していないので質問内容が不明な点が多いと思うのですが、頭を整理すると(2)を一番知りたいと思っているので(2)の方を教えていただけないでしょうか?ご迷惑かけてすみません。
(2)では
1 #include <stdio.h>
2 #include <time.h>
3 #include <stdlib.h>
4 #define P 0.05
5 int main(void)
6 {
7 int i,abc;
8 double x;
9 srand(time(NULL));
10 x = (double)rand()/RAND_MAX;
11 for(i=0;i<1000000;i++){
12 if(x > P){
13 abc++;
14 }
15}
・・・
11から14行目の処理で1/20000の確率でabcに+1していきたいと思っているのですが(for文が抜けてました)、Pとxの調整次第、もしくは別の条件文で可能なのかと考えています。私のプログラムだとどのくらいの確率でabcに++していくのか分からないので。後からいろいろ確率を変えてみてそれを1/10000、1/20000、・・・のそれぞれの確率でabcがどのように変わったか表にまとめていみたいと思っています。
再度すみませんがアドバイスをお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.NET 小数点以下の切り捨てにつ...
-
get_sqr()という関数について
-
doubleの変数にintとintの割り...
-
C 開放してるのにエラー(doubl...
-
C言語で内積、、、わかりません。
-
c言語 プログラム
-
このプログラムを添削してください
-
プログラムでの数字につく”f”の...
-
fgets()による繰り返し入力(c言語)
-
C言語を実行すると-infが出てき...
-
floating point not loadedとは?
-
float型とdouble型の変数の違い...
-
C#、太らせた多角形を塗りつぶ...
-
c言語で、繰り返し文の中で、0....
-
実数型の変数に値を入力した計...
-
複利の利率を求めるプログラム...
-
int とdoubleの比較
-
c言語でDFTのプログラムを作成...
-
C言語のプログラムで#include<m...
-
C言語で-23乗を取り扱うには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
2次方程式の解を求めるプログ...
-
関数におけるif文とreturn文に...
-
doubleは常に%lfとするべきなのか
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
C言語で-23乗を取り扱うには
-
データ数の多い構造体配列
-
指数の表示
-
C言語のpow関数の不具合
-
c言語のプログラミングについて...
-
c言語のコンパイルエラー canno...
おすすめ情報