前提・実現したいこと
C言語でガウス分布(正規分布)を出すような関数を作っているのですが,上手く作れません。
https://omitakahiro.github.io/random/random_variables_generation.html#Prepare_MT
こちらのサイトを参考にして次のコードを書きました。しかし,標準正規分布の場合にして,例えばn=10000の場合に対してガウス分布を通したものに対して合計値を出力しても,その値が0になりません。
当然その値が0にはならないと思いますが,限りなく0に近い値になるはずです。少なくとも,後述するように-135程度の比較的大きい値になるとは考えられないです。
何がおかしいのか分かりません。型はfloatで,要素数nのベクトルをガウス分布で初期化する方法を教えてください。
よろしくお願いします。
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4#include <time.h> 5 6//[0:1]の一様乱数を生成 7float uniform( void ){ 8 return rand()/(RAND_MAX+1.0); 9} 10 11//要素数nのoを正規分布で初期化 12void Gaussian_init(int n, float *o, float mu, float sigma){ 13 int i; 14 for(i=0;i<n;i++){ 15 float z =sqrt( -2.0*log(uniform()) ) * cos( 2.0*M_PI*uniform() ); 16 o[i] = sigma * z + mu; 17 } 18} 19 20int main() { 21 srand(time(NULL)); 22 int n = 10000; 23 float *x = malloc(sizeof(float) * n); 24 float sum = 0.0; 25 26 Gaussian_init(n, x, 0.0, 1.0); 27 for (int i = 0; i < n; i++) { 28 sum += x[i]; 29 } 30 printf("sum = %lf\n", sum); 31 32 return 0; 33} 34
出力結果
sum = -135.292908
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。