###前提・実現したいこと
次のような問題のプログラムで、コンパイルはできるのですが実行するとエラーが出てしまいます。
(cygwinにgccを入れてやっています)
コインを100回投げる試行を行うことを考える。
メトロポリスの方法を使って、二項分布に従うマルコフ過程から10000個分のサンプル列を作成せよ。
ただし、確率変数kとすると、kの次にはk-1かk+1が1/2の確率でそれぞれ選ばれ、0と100はつながっているものとする。
おそらく除算をしているところで不具合が起きているのではないかと考えているのですが・・・。
お手数ですがよろしくお願いいたします。
###発生している問題・エラーメッセージ
Floating point exception (コアダンプ)
###該当のソースコード
C
1#include<stdio.h> 2#include<math.h> 3#include<stdlib.h> 4#include<stdint.h> 5 6#define K 0 7 8uint32_t xor128(void) { //乱数の生成(0以上2^32未満) 9 static uint32_t x = 123456789; 10 static uint32_t y = 362436069; 11 static uint32_t z = 521288629; 12 static uint32_t w = 88675123; 13 uint32_t t; 14 15 t = x ^ (x << 11); 16 x = y; y = z; z = w; 17 return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 18} 19 20int fac(int n) { //階乗の計算 21 int result = 1; 22 int k; 23 24 for (k = 1; k <= n; k++) { 25 result *= k; 26 } 27 return result; 28} 29 30int cmb(int n, int k){ //combinationの計算 31 int c; 32 c = fac(n) / (fac(k) * fac(n - k)); 33 return c; 34} 35 36int main(void){ 37 int P[101]; 38 int W[101] = {0}; 39 int i, k, l; 40 long a; 41 double r; 42 43 P[0] = 1; 44 P[100] = 1; 45 46 for (i = 1; i <= 99; i++){ 47 P[i] = cmb(100,i); 48 } 49 50 W[K]++; 51 k = K; 52 53 for (i = 1; i < 10000; i++){ 54 a = xor128(); 55 if (a < pow(2, 31)){ 56 l = k - 1; 57 if (l == -1){ 58 l = 100; 59 } 60 } 61 else{ 62 l = k + 1; 63 if (l == 101){ 64 l = 0; 65 } 66 } 67 68 a = xor128(); 69 r = (double)P[l] / (double)P[k]; 70 r = fmin(r, 1); 71 if (a < pow(2, 32)*r){ 72 k = l; 73 } 74 75 W[k]++; 76 } 77 78 for (i = 0; i <= 100;i++){ 79 printf("%d\n",W[i]); 80 } 81 82 return 0; 83} 84

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/22 12:55