HappyGeekLife 


Skip to content, navigation.


Lifehack しながらプログラミングなどを紹介するブログ。
  • プロフィール
  • ポートフォリオ
  • ニュース

‘c’ タグのついている投稿

« 前ページへ

C言語の乱数発生法いろいろ

2008年1月8日 火曜日

今日はC言語を使って乱数を発生させる方法をいろいろと紹介します。

まずは以前お伝えした乱数発生法をおさらいしましょう。
基本的なことですが、C言語による擬似乱数の発生にはrand()関数を用います。

#include <stdlib>

#include <time>/* ここからは関数内に記述 */

srand((unsigned)time(NULL)); //乱数の初期化

rand(); // 乱数を発生

これだけ。

次に、正規分布に従う乱数を発生させる方法を紹介します。
これは、正規乱数と呼ばれています。
代表的な方法にはボックス・ミュラー法があります。

ボックス・ミュラー法とは、
2つの一様乱数 U1,U2があるとき、
Z1 = (-2logeU1)1/2cos2πU2
Z2 = (-2logeU1)1/2sin2πU2
で得られるZ1,Z2は標準正規分布(平均値0,標準偏差1)に従う互いに独立な正規乱数となります。
この乱数の発生頻度を表すと釣り鐘のような形のグラフ(いわゆる正規分布のグラフ)になります。
参考:Box-Muller Transformation

そこで、上のボックス・ミュラー法を拡張して、平均m,標準偏差σの正規分布N(m,σ)に従う乱数の発生方法を書いてみます。

#include <stdlib>

#include <math>

#include <time>

#define PI 3.14159265358979 /* 円周率 *//* ここからは関数内に書いてください。 */

/* box and muller法 */

double sigma; // 標準偏差σに対応

double r1,r2;

double Z1,Z2;

srand((unsigned)time(NULL)); //乱数の初期化

r1=rand()/RAND_MAX;

r2=rand()/RAND_MAX;

Z1=sigma*sqrt(-2*log(r1))*cos(2*PI*r2)+m; // x成分

Z2=sigma*sqrt(-2*log(r1))*sin(2*PI*r2)+m;  // y成分

こんな形で書くことが明確で高速な方法だそうです。
正規乱数を必要とした場合には是非ご活用ください。

他にもc言語が慣れてきてプログラミング技術を磨きたいと思われた方はこちらをおすすめします。

タグ:c
カテゴリー: 雑記・その他もろもろ | 2件のコメント »

C言語の勉強

2007年12月11日 火曜日

またまたC言語の勉強をしています。
というのも研究でC言語使うので。

今日は乱数発生をメインに勉強しました。
いわゆるrand()関数です。

まず、rand()関数が取り得る値の範囲です。
C言語によると、
rand()関数は0~RAND_MAXの範囲の値を取り、コンパイラによって値が異なるのですが、

printf("RAND_MAX = %dn",RAND_MAX);

と書いて一発で解決できました。

しかし、僕はこんなことを知らず、まぁ30000回テストすれば最大値ぐらいわかるだろうと踏んで、

int count=0;
unsigned int i = 0;
unsigned int max = 0;

while (count < 30000){
    i = rand();
    if (max < i){
       max = i;
    }
    count++;
}
printf("%dn",max);

というコードを書いた結果32766という値がでました。
この1という差ですが、もちろん出来合いのコンパイラを信じました笑

—-追記——————————————————
ちょっとわかりづらいと思うので、追記ということで。
もちろんprintf(”RAND_MAX = %d\n”,RAND_MAX);
の方が正しいのですが、
なぜ2個目の実測プログラムが間違っているのかというと、
32767は1/32767の確率で出現するので、測定回数が少なかったわけです。

タグ:c
カテゴリー: tutorials | コメントはまだありません »

c言語の再確認。

2007年9月20日 木曜日

どうやら前回つまった原因は、型が悪い&オーバーフローだったみたいです。

前回のものには書いていなかった入力される数っていうのは、unsigned char型だったので、intに合わせてやりました。
特にキャストとかはしてないんですが、intならあってくれました。

一度unsigned intの配列に数字をいくつか放り込んでからdoubleの要素に入れなおしてます。
ちょっと馬鹿げた書き方をしてるんですが、これでしかできずしょうがなかったので・・・。
そこらへんを書いてみます。

unsigned int short_sum[100];
int scount;
自分で付けた型 *RcvData = PhyTestParamCb;
int LOOPcount;
double sum;
~~初期化は割愛~~
short_sum[scount] = short_sum[scount] + RcvData->ener_level;
if (LOOPcount % 20 == 0 && LOOPcount != 0 || LOOPcount == 1999){
  sum = sum + short_sum[scount];
  scount++;
}

こんな感じで、何とか回避。
あとは普通に平均を出せば良いってことで、

int average;
int okcount;
~~初期化は割愛~~
average = sum / okcount;

みたいな感じです。
averageはdoubleの方が精度が良いはずなのに、メモリが足りずできなかった。

型は今後も気をつけた方が良さそう。
PHPは楽だな~。

タグ:c
カテゴリー: 雑記・その他もろもろ | コメントはまだありません »

« 前ページへ
  • Contact Me

  • RSSを購読する

    RSSを購読する
  • Google Adsenseで機械的に稼ぎ続ける最速戦略書 AdSense systematic package
    手軽に稼げる!携帯アフィリサイト自動生成ツールはこちら
  • 最近のエントリー

    • ハイパーITコンサルタントになる。
    • CSS3でWikipediaのような動的ハイライトコンテンツを作る
    • ダウンロードしておくべき便利でフリーなWebデザインE-Book 12種類
    • あなたのワークフローを自動化する強力なCSSツール
    • クリエイティブなプロジェクトに活用したい厳選フリーフォント
    • フリーで使えるオンライン画像編集Pixlr
    • kernel panicとは
    • 我が家のPCのその後。
    • Ubuntuが死んだ日にはアンインストールを。
    • うーむ、不調。。
  • カテゴリー

    • javascript (25)
    • Lifehack (24)
    • marketing (5)
    • photo (1)
    • php (47)
    • Search Engine Optimization (9)
    • tutorials (48)
    • Ubuntu (8)
    • Vimperator (1)
    • webdesign (20)
    • webiner (1)
    • webservices (14)
    • wordpress (21)
    • 雑記・その他もろもろ (82)
  • あわせて読みたい

Happy Geek Life is proudly powered by WordPress
投稿 (RSS) と コメント (RSS)

雑記 Ajax analysis API book books business c CakePHP css eclipse English Ethna Excel Firefox GAE Google Greasemonkey javascript Lifehacks linux LPO marketing mysql network news Opensource perl photoshop php programming python ruby SEO tips tool tutorials Ubuntu Vim Vimperator webdesign webservices wordpress yahoo pipes ZigBee

Copyright © 2010 Happy Geek Life. All Rights Reserved. Design: David Kohout | Our tip Efektim Real Estate