質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

2065閲覧

ガチャシュミレータの作成

toookiii

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/06/10 09:31

編集2020/06/10 10:03

前提・実現したいこと
ガチャシュミレータを作成しファイルには値段がいくらで当たりを引けたのかを書き込みたい
ここに質問の内容を詳しく書いてください。
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にしてみたがうまくいかなかった

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/06/10 09:33

うまくいかないとはどうなるんでしょうか。 また、このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
toookiii

2020/06/10 09:51

ご忠告ありがとうございます 早速修正さしていただきました
y_waiwai

2020/06/10 09:56

コードはちゃんとされてませんねー
toookiii

2020/06/10 10:04

何度もすみません ありがとうございます
cateye

2020/06/10 10:45

ちょっと見ですが、0.02%って2/10000ですよね? rand()%100で出ますか?・・・素直に10000までにすれば?
toookiii

2020/06/10 10:49

y[i]で100で割り直しているので大丈夫だと思うのですが 完成して手直しの際に参考に指していただきます
cateye

2020/06/10 11:25 編集

C標準のrand()は、精度があれwなので、乱数生成についてはMT(Mersenne Twister)をお勧めします。↓ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html あと、他の方も指摘されていますが、<code>で出てくる``` と```の間にソースを貼り付けて下さい。・・・今のままでは非常に見づらい。
toookiii

2020/06/10 11:36

申し訳ございません 先ほどやっとやり方を理解しました
episteme

2020/06/10 21:53

[余計なお世話] 誤: シュミレータ 正: シミュレータ
guest

回答1

0

自己解決

二重のfor文の中で乱数発生を組み込んだらうまくいけました
お騒がせしました

ここに言語を入力

#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];}//乱数を発生 printf("当たり確率%lf\n",a[0]);printf("一つ目の乱数値%lf\n",y[0]); min=30000;max=0;//初期化しておく printf("%lf\n",y[1]);printf("%lf\n",y[2]);//乱数がきちんと発生されているのか確認 for(j=1;j<=a[2];j++){ for(i=1;i<=a[2];i++){GetRandom(x,i);y[i]=(double)x[i]; if(y[i]<=2) { //printf("%d",i); 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;}}} printf("%d\n",gold[2]);printf("%d\n",gold[1]);//違う値が保存できているのかの確認 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()%10000+1;}//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;} }}

投稿2020/06/10 11:34

toookiii

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問