今日(2020/06/20)からアルゴリズムを勉強していこうと思う。選ばれたのはC言語です。理由は単純で今勉強中だから。メモ用として使っていくので詳しい解説はしない(というか知識がないからできない)。よく参考書にあるような数字の計算から始めるわけではないのでそこは理解していただきたい。では早速やっていこう。
環境構築に関しては以下の記事を参考にして構築した。(Windows)
※Macはわかりませんので各自で調べてください。
https://webkaru.net/clang/mingw-gcc-environments/
使用している書籍:C言語によるはじめてのアルゴリズム入門
著者:河西朝雄
#線形合同法
前回モンテカルロ法を実施したときに乱数が線形合同法で作成されているということを知ったので今回は線形合同法について書いていく。
簡単に説明すると漸化式を使用して乱数を生成している。漸化式は以下の通り。
x_{n} = (Ax_{n-1} + C) (mod M)
random.c
#include <stdio.h>
// x0を定義している
unsigned int first_num = 13;
int index = 0;
unsigned rnd(void){
// 漸化式のx1を求めている
// 今回はAを109,Cを1021,Mを32768と設定している
first_num = (first_num*109+1021)%32768;
return first_num;
}
int main(void){
int j;
for(j = 0;j<100;j++){
printf("%8d",rnd());
index++;
if(index % 5 == 0){
printf("\n");
}
}
}
#出力結果
4965 15869 13781 237 30021
14557 16821 21965 2853 18365
16789 32429 21765 27293 13685
31629 21221 8573 7509 19565
1221 27741 31029 29005 27301
19261 18709 27181 1157 15901
3317 14093 21093 17661 17621
22509 21573 24541 28853 19661
2597 3773 4245 5549 29701
20893 9333 12941 4581 10365
11349 9069 25541 4957 10293
26701 27045 4669 6165 301
9093 9501 31733 28173 4453
19453 21461 12013 13125 1757
8117 17357 2341 21949 24469
11437 4869 14493 4981 27021
20709 12157 15189 31341 17093
14941 22325 24397 26789 22845
26389 6189 17029 3101 27381
9485 20581 21245 25301 1517
#まとめ
今回作成した関数のmodのMはRAND_MAXに対応しているのかなと思った。また、変数や関数の命名が下手なのでもっとわかりやすい変数名を付けれるようになりたい。アドバイスなどがあれば是非コメントお願いします!