• 締切済み

乱数に関する質問

(使ってる開発環境はBCCDeveloperです) 乱数に関する質問なんですが 構造体の中の変数に乱数を代入しようとすると 代入したい乱数が、その前後にある構造体に入れようよした数が乱数の値になってしまいます それはどうしてなのでしょうか またどうやって解決すればいいでしょうか 文章の説明だけではわかりずらいと思うので ↓にコメント入りでその詳細を書きました #include<stdio.h> #include <stdlib.h> struct hop{ int kougeki; int gard; int hit; }; struct kio{ int atock; int bougyo; int lis; }; int tekiw(); int sare(); void main(){ int i=8; struct kio teki; struct hop player; player.kougeki= 40 player.gard =50 player.hit= 60 int p; srand((unsigned)time( NULL )); if(i=8){ teki.atock=rand()%60; //ここら変の乱数の値が上の構造体変数に代入した どれかの数になっている teki.bougyo= rand()%50; //ここも同じ teki.lis =rand()%40; //ここも同じ }; p=8; tekiw(); }; int tekiw(struct kio teki){ printf("%d",teki.lis); return teki.lis; };

  • tukai
  • お礼率57% (102/177)

みんなの回答

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

player.kougeki= 40 player.gard =50 player.hit= 60 セミコロンがなくこれではコンパイルすら通りません。 元のソースを色々削っていませんか? 恐らく配列(あるいはポインタ)でやっていて、誤って隣の配列まで書き換えてるって ミスの類のような気がします。 struct kio teki[100]; のように if(i=8){ あとこれがおかしい。必ず真になります。 if(i==8){ では?

tukai
質問者

お礼

if(i==8){ ガ正しいですね コピペではないので っちょっと書き間違えてしまいました お陰で問題が解決しました 有難う御座いました

  • ggaogg
  • ベストアンサー率43% (38/88)
回答No.1

tukaiさんのソースは改行が妙に多いのでちょっと直して改行省いてみました。 #include<stdio.h> #include <stdlib.h> struct hop{ int kougeki;//攻撃 int gard;//ガード int hit;//ヒット }; struct kio{ int atock; int bougyo; int lis; }; int tekiw(); int sare(); void main(){ int i=8; //? struct kio teki; struct hop player={40,50,60}; int p; //? srand((unsigned)time( NULL )); if(i=8){ teki.atock=rand()%60; //ここら変の乱数の値が上の構造体変数に代入した どれかの数になっている teki.bougyo= rand()%50; //ここも同じ teki.lis =rand()%40; //ここも同じ }; p=8; //? tekiw(); //? }; int tekiw(struct kio teki){ printf("%d",teki.lis); return teki.lis; }; 幾分かみやすくなったと思います。これによって回答する気になった方はしてあげてくださいね。 ちなみに、「//?」というコメントは、理解できない部分です。 あと、main関数の中にある tekiw(); これは型があってないんじゃないでしょうか。 tekiw(teki); ならまだしも。 sare()も、型宣言はされているのに、どこにもでてきてない部分も謎です。 >構造体の中の変数に乱数を代入しようとすると >代入したい乱数が、その前後にある構造体に入れようよした数が乱数の値になってしまいます つまり構造体の中の1つに乱数を代入しようとしたけど代入しようとした乱数がそこに入らないでその前後に入ってしまう、ということでしょうか。 いずれにしろ補足の説明や、切り抜いているのであれば、把握に必要な範囲のソースをお願いします。どういう結果になるのかは、プログラムを走らせてみないと分からないので。(ということで、結局はまともな回答できないということですが・・。) 老婆心ですが、敵とプレイヤーの構造体はそれぞれで作成する必要はないと思います。

tukai
質問者

お礼

有難う御座いました おかげで問題は解決しました

関連するQ&A

  • freadを使用した構造体に乱数を発生させ

    タイトルの通りなのですが 一度.binファイルに構造体(date)を読み書きさせ、その構造体で乱数を発生させランダムにキャラを指定の部分に表示させるプログラムなのですが、どうしても配列として扱えないのか乱数部分に(teki)を入れてもエラーになったりしてしまいます。 このプログラムで乱数→配列に代入→配列の[0][1]の取り出し→表示 は可能でしょうか。 すべて書けなかったので一部抜いています typedef struct{ char name[10]; int life; int MP; int att; int defe; }TEKI; TEKI date[20]={ {"ソリッド ",100,100, 90, 80}, {"リキッド ",100,100, 70, 80},              (略) {"マンティス ",100, 80, 70, 70}, {"ビッグ.ボス",100,100, 90, 90}, },*OFF,*DEF,MC[2],teki; srand((unsigned)time(NULL)); /*-------書き込み-------*/ //テキスト fp_txt=fopen("monster.txt","w"); if(fp_txt==NULL){return -1;} for(i=0;i<20;i++){ fprintf(fp_txt,"%s %3d %3d %3d %3d\n",date[i].name,date[i].life,date[i].MP,date[i].att,date[i].defe); } //バイナリ fp_bin=fopen("monster.bin","wb"); if(fp_bin==NULL){return -1;} fwrite(&date,sizeof(date),1,fp_bin); fclose(fp_txt); fclose(fp_bin); /*----------------------*/ fp_bin=fopen("monster.bin","rb"); if(fp_bin==NULL){ return -1; }       fread(&teki,sizeof(TEKI),21,fp_bin); /*--------乱数発生------*/ for(i=0;i<20;i++) rand_hai[i]=i; for(i=20;i>1;i--){ rnd=rand()%i; wk=rand_hai[i-1]; rand_hai[i-1]=rand_hai[rnd]; rand_hai[rnd]=wk; } sen=rand_hai[0]; kou=rand_hai[1]; MC[0]=date[sen]; MC[1]=date[kou]; /*----------------------*/ ban^=0x00000001; OFF=&MC[ban]; DEF=&MC[ban^0x00000001]; pos.X=50; pos.Y=5; SetConsoleCursorPosition(hStdout, pos); printf("[%s]",teki.name); pos.X=16; pos.Y=13; SetConsoleCursorPosition(hStdout, pos); printf("[%s]",teki.name); _getch(); fclose(fp_txt); fclose(fp_bin);

  • 乱数

    ポケコンのC言語で乱数を変数に代入したいのですがうまくいきません。 変数に代入したい数は1~10までの整数なので、 a=1+rand(void)%10; と入力すると、syntax errorとでてきました。 因みにパソコンのC++上では動作しました。 考えられる原因をお教えください。よろしくお願いいたします。

  • 乱数発生

    #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以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #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を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • メルセンヌツイスターによる乱数の使い方

    メルセンヌツイスターによる乱数を生成したいのですが、下記コードにすると、mt_rand関数を呼ぶたびにシードが初期化され他乱数が生成されます。 やりたいことは、main関数で一度シード101で初期化した後は、mt_rand関数内では、初期化することなく継続した乱数を生成したいのです。 そのためa_mt_rand関数のようにすると、mtが定義されていないとなるエラーとなります。 namespaceの問題と思うのですが、色々試してみましたが、できませんでした。 どのようにすればできるでしょうか。 vc++11、windows11 使用 参考サイト C++ 乱数ライブラリ std::random の使い方 リンクはうまく貼れませんでした。 #pragma hdrstop #include <iostream> #include <stdio.h> #include <random> using namespace std; void mt_rand(void); int main(int argc, char *argv[]) { int ptr; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("ptr=%d\n",ptr); mt_rand(); } void mt_rand(void) { int ptr=0; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("%d\n",ptr); } void a_mt_rand(void) { int ptr=0; ptr = rand100(mt); printf("%d\n",ptr); }

  • 乱数について

    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でやると乱数が同じ値しか出てきません。 教えてください。

  • 標準正規分布の乱数

    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; } お忙しい中、教えていただけたらうれしいです。

  • 乱数について

    C の入門書を1冊読み終え、簡単なプログラムを作成しようとしているのですが、 早速分からないことが出たので教えて頂ければと思います。 --------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int num; int i = 0; while( i < 4 ){ srand(time(NULL)); num = rand()%100; printf("%d\n", num); i++; } return 0; } --------------------------------------------- 上記を実行したのですが、秒数を乱数の種としているため4回とも同じ値を取得してしまいます。 より高精度に秒数を取得することは可能でしょうか? もしくはこのようなかたちで4回ともに異なる数を得ることが出来る方法がありましたら教えて頂きたいと思います。

  • C++で乱数を重複しないように発生させる

    C++で乱数を重複しないように発生させるようにプログラムを変更しろと言われたのですが、できません。 教えていただきたいです。 #include<iostream> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; int main() { int i,n; int *p; cout<<"何個記憶しますか?"<<endl; cin>>n; p=new int[n]; if(p==NULL){ cout<<"記憶域の確保に失敗しました。"<<endl; return 1; } srand((unsigned)time(NULL)); rand(); i=0; while(i<n){ p[i]=1+(int)((double)rand()/(RAND_MAX+1.0)*75); if(p[i]==p[i]) cout<<"p["<<i<<"]の値"<<p[i]<<endl; i++; } delete[] p; return 0; }

専門家に質問してみよう