前提・実現したいこと
ガチャシュミレータを作成しファイルには値段がいくらで当たりを引けたのかを書き込みたい
ここに質問の内容を詳しく書いてください。
C言語のLinuxでガチャシュミレータを作っています
確率を0.02%と設定しているのですが確率が偏っており5万~10万の間にすべて収まってしまっている状態です→バラけるようにしたいです
最大値,最小値が同じ値で保存されているのもなぜなのかわからない状態です→それぞれ違う値できちんと保存されて欲しいです
コード ``#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include <time.h> #define L 100000 //生成個数 void shoki(double a[],int argc,char *argv[]);//初期化 void GetRandom(unsigned int x[],int i);//乱数発生 int main(int argc,char* argv[]) { unsigned int now = (unsigned int)time( 0 ); srand( now ); int i,j,h; double y[L],a[4]; int min,max=100;//最大,最小を格納 double sum=0;//金額の合計を保存 int count[10]={0};//何回当たったかを数える unsigned int x[L]; FILE *fp;//ファイルを定義 int gold[L]={0};//かかった金額を保存する配列 shoki(a,argc,argv);//コマンドラインから出力 for(i=0;i<=a[2];i++){GetRandom(x,i);y[i]=(double)x[i]/100;}//乱数を発生 printf("当たり確率%lf\n",a[0]);printf("一つ目の乱数値%lf\n",y[0]); min=30000;max=0; for(j=1;j<=a[2];j++){ for(i=1;i<=a[2];i++){ if(y[i]<=a[0]) { gold[j]=i*a[1];//金額を保存 sum=sum+gold[j];//合計金額を保存 if(gold[j]>max){max=gold[j];}//最大値を保存 else{if(gold[j]<min){min=gold[j];}//最小値を保存 }break;}}} for(j=1;j<=a[2];j++)//回数をそれぞれの場合で数える { if((0<gold[j])&&(gold[j]<a[3])){ count[0]=count[0]+1; }else{ if(gold[j]<2*a[3]){ count[1]=count[1]+1; }else{ if(gold[j]<3*a[3]){ count[2]=count[2]+1; }else{ if(gold[j]<4*a[3]){ count[3]=count[3]+1; }else{ if(gold[j]<5*a[3]){ count[4]=count[4]+1; }else{ if(gold[j]<6*a[3]){ count[5]=count[5]+1; }else{ if(gold[j]<7*a[3]){ count[6]=count[6]+1; }else{ if(gold[j]<8*a[3]){ count[7]=count[7]+1; }else{ if(gold[j]<9*a[3]){ count[8]=count[8]+1; }else{ count[9]=count[9]+1;} }}}}}}}} } if((fp=fopen("ガチャ.csv","w"))==NULL){ printf("ファイルが出力されませんでした\n"); exit(1);} for(i=1;i<10;i++){ fprintf(fp, "%.0lf--%.0lf,%d\n",a[3]/10000*(i-1),a[3]/10000*i,count[i-1]);}//ファイルに出力 fclose(fp); printf("min=%d,max=%d,avg=%lf\n",min,max,sum/a[2]); return 0;} void GetRandom(unsigned int x[],int i)//乱数生成関数 { x[i]=rand()%100;}//x[i]=rand()%100;}//x[i+1]=(4*x[i] + 7 ) % 100;}; void shoki(double a[],int argc,char* argv[])//初期化の関数 { int opt; //コマンドラインで打たれたものを読み込む while((opt = getopt(argc, argv, "R:C:T:B:")) !=-1){ switch (opt) { case 'R': a[0] = atof(optarg);//出現確率 break; case 'C': a[1] = atof(optarg);//金額 break; case 'T': a[2] = atof(optarg);//試行回数 break; case'B': a[3] = atof(optarg);//度数分布の区間幅 break; default: break;} }} ` ### 試したこと 乱数の部分が間違っているのかと思いrandにしてみたがうまくいかなかった
回答1件
あなたの回答
tips
プレビュー