エクセルへの正規乱数出力方法

このQ&Aのポイント
  • 正規乱数を発生させるプログラムを使用し、エクセルに出力する方法を教えてください。
  • C言語で作成した正規乱数のプログラムを使って、エクセルに正規乱数を出力したいです。具体的な方法を教えてください。
  • 正規乱数をエクセルに出力させるための手順やコードを教えてください。
回答を見る
  • ベストアンサー

正規乱数をエクセルに

正規乱数を発生させるプログラムを作ったのですが、これをエクセルに出力させるにはどのようにすればよいのでしょうか?すみませんが教えてください(__) #include<stdio.h> #include<stdlib.h> #include<math.h> void ran(double,double,double *); void main(void) {   int i;   double x;   for(i=0;i<1000;i++){     ran(1.0,0.0,&x);       printf("%f\n",x);      } } void ran(double sig,double m,double *x) {   double r1,r2;   r1=rand()/32767.1;   r2=rand()/32767.1;   *x=sig*sqrt(-2*log(r1))*sin(2*3.141592*r2)+m; }

質問者が選んだベストアンサー

  • ベストアンサー
  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.2

No.1の補足への回答です。 もし、プログラムで直接csvファイルを生成したいなら、 ・ファイルポインタの宣言 FILE * fp; ・書き込みモードでのテキストファイルのオープン (例)fp = fopen("C:\\excelfiles\\aaa.csv","w");          ※↑中身は適当に書きました。 ・printf関数をfprintf関数に替える。fprintf(fp,"%f\n",x); ・ファイルのクローズ fclose(fp); を追加すればよいと思います。詳細はC言語の本かヘルプを見てください。 さらにコードを追加すると、プログラムを実行するとExcelが起動し、シートに乱数が自動的に書き込まれているというのも可能だと思います。(exec系関数でExcelをオプションつきで起動。)試していませんので自信はありません。 逆に、エクセルのVBAからお作りになったプログラムを呼び出し、シートに乱数を書き込む方法もあると思います。そのあたりまでお望みの場合は研究してみてください。

laview
質問者

お礼

ありがとうございます。とても参考になりました。

その他の回答 (1)

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.1

もしOSがWindowsで、お作りになったプログラムがコマンドプロンプト(MS-DOSプロンプト)上で実行するもので、実行ファイルの名前が test.exe だったとすると、 test >aaa.csv などと打って標準出力を適当なcsvファイル(aaaは適当な名前)にリダイレクトし、できたaaa.csvをエクセルで読み込めばよいと思います。 事情がわからないので、そういう話ではない、という場合は補足してください。

laview
質問者

補足

ありがとうございます。早速試し、成功しました。 もしよろしければ、プログラム上での処理法を教えていただけないでしょうか?

関連するQ&A

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • 毎回違う乱数を生成するにはどうしたらいいでしょうか

    C言語の初心者です。よろしくお願いいたします! 乱数に関する質問:毎回違う乱数を生成するにはどうすればいいでしょうか。 学校の講義の中に  >>time() は1970 年1 月1 日0 時0 分(標準時)からの経過秒数を返 すため,1 秒以内に何度も実行すると,同じ数字で乱数を初期化す ることになり,結果も同じになってしまう. という記述がありますが、時間を置いてから、実行しても同じ結果となりました。 その一 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x,y; int i,index=0; double a,n; printf("How many trials?..."); scanf("%lf",&n); for (i=0;i<n;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1) index++;} a=4*index/n; printf("Result is %.2f(%.2f)",a,sin(-a)); return 0; } その二 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; srand((unsigned)time(NULL)); a=(int)(rand()/(RAND_MAX+1.0)*10); printf("%d\n",a); return 0; } お忙しい中、教えていただけたらうれしいです。

  • Visial C++おけるπの使い方

    自宅でCプログラミングの練習をするためVisial C++ 2008を使って プログラムをしています。y<sin(πx)となった時の 割合などを計算するプログラムで                「M_PIが定義されていない識別子です」 とでてきます。所持している本を参考にしてもM_PI=πとして用いる と書いてあり、math.hもインクルードしてるので原因が分からなくて 困ってます。Visial c++ではπの使い方には何か別の使い方がある のでしょうか?よろしくお願いします。 *↓が実際に作ったプログラムです。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> int main(void){ int i,n,count=0; double x,y,r,error; srand((unsigned)time(NULL)); /*乱数の初期化*/ printf("How many trials?"); scanf("&d",&n); for(i=0;i<n;i++){ x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if(y<sin(M_PI*x)){ count++; } } r=(double)count/n; /*キャスト演算子を使用*/ error=2/M_PI-r; printf("Result is %f (Error: %f)\n",r,error); return 0; }

  • 乱数発生

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

  • 乱数の度数分布を調べたいC言語

    乱数の度数分布をしらべたいのですがうまくいきません。 grand()は標準正規分布の乱数です。(検索してコピペしたものです。) すいませんが、ご教授お願いします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) double grand(); main(void){ int j, N, n[6]; double x; N=1000; for (j = 1; j <= N; j++) { x = grand(); if(-1.5< x <= -1.0){n[0] = n[0] + 1;} if(-1.0< x <= -0.5){n[1] = n[1] + 1;} if(-0.5< x <= 0.0){n[2] = n[2] + 1;} if(0.0< x <= 0.5){n[3] = n[3] + 1;} if(0.5< x <= 1.0){n[4] = n[4] + 1;} if(1.0< x <= 1.5){n[5]= n[5] + 1;} } printf(" %d \n %d \n %d \n %d \n %d \n %d \n", n[0], n[1], n[2], n[3], n[4], n[5]); return 0; } double grand() { static double V1, V2, S; static int phase = 0; double X; if(phase == 0) { do { double U1 = RAND(); double U2 = RAND(); V1 = 2 * U1 - 1; V2 = 2 * U2 - 1; S = V1 * V1 + V2 * V2; } while(S >= 1 || S == 0); X = V1 * sqrt(-2 * log(S) / S); } else X = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; return X; }

  • C言語を実行すると-infが出てきて困っています。

    C言語を実行すると-infが出てきて困っています。 コンパイラはgccを使っています。 よろしくお願いします。 #include <stdio.h> #include <math.h> #include <stdlib.h> #define data 100//計算回数 double seiki(void)//正規乱数 { double n; double i; double y; double x1,x2; double sigma; double mean; double Pi = 2*asin(1); sigma = 1; mean = 0; { x1 = (double)rand()/(RAND_MAX); x2 = (double)rand()/(RAND_MAX); y = sigma*sqrt(-2*log(x1))*sin(2*Pi*x2) + mean; //printf("%f\n",y); } return (y); } int main(void) { double* price; int i, j, k; double a, b, c; //メモリ確保 price=(double*)malloc(sizeof(double)*data+10); for(i = 0;i<data;i++) { price[i+1] = price[i]+seiki(); printf("%lf\n",price[i+1]); } return 0; }

  • java プログラム 範囲を指定した乱数

    正規乱数をボックスミューらー法で発生させて、 範囲を指定して出力したいと思ってます。 プログラムを作成してみたのですが・・・ 平均50で範囲を48から52にしたいのですが たまに範囲外というか「0.0」が出力されてしまいます。 アドバイスをください import java.util.*; public class test2{ public static void main(String args[]){ double R,S; double r[]=new double[200];  double s[]=new double[200]; double s1[]=new double[200]; Random ran=new Random();    for(int i=0;i<200;i++){     R=ran.nextDouble(); S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble())); r[i]=R; s1[i]=S; if(50-2<s1[i]){ if(50+2>s1[i]){ s[i]=s1[i]; } } } for(int j=0;j<150;j++){ System.out.println(s[j]); } } } お願いします

    • ベストアンサー
    • Java
  • 乱数について

    Visual Studio2008を使っています。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i; srand(time(NULL)); i=rand(); printf("%d\n",i); return 0; } 乱数を作るために上のようなプログラミングを作りました。 これを「ソリューションのビルド」すると 【warning C4244: '引数' : 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。】 と出ます。 このまま行っても乱数が出来るのですが どうしたらいいのでしょうか? 8行目を srand(time_t(NULL)); srand((unsigned)time(NULL)); と変えればいいのでしょうか? time_tでやると乱数が同じ値しか出てきません。 教えてください。

  • 初心者の作ったプログラムの問題点を指摘ください。

    下のように、0から9までの乱数の発生回数の標準偏差を求めるプログラムを組んでみたのですが、最後のシグマの演算が無視されてしまい、0.000000と出力されてしまいます。どこがいけないのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<math.h> int main (void){ int N,i,j,r,a[10]={0,0,0,0,0,0,0,0,0,0}; double S=0; printf("How many trials?;"); scanf("%d",&N); srand((unsigned)time(NULL)); /*初期化*/ for(i=0;i<N;i=i+1) { r=(int)(rand()/(RAND_MAX +1.0)*10); /*乱数N個取得*/ a[r]=a[r]+1; } for(r=0;r<10;r=r+1){ printf("a[%d]=%d.\n",r,a[r]); S=1/10*(S+sqrt((a[r]-N/10)*(a[r]-N/10)));  /*演算(無視されてしまう・・・)*/ } printf("Sigma=%f",&S); return 0; }

専門家に質問してみよう