• ベストアンサー

MFCにて乱数

CString time; p=rand()%20*1000+1; time.Format(_T("%d"),p/1000); にて変数pに乱数を代入し、画面出力します。 CString strp; strp.Format(_T("%d"), p/1000); にてpを型変換して、画面出力するのですが、双方のpの値が一致しません。 どうなってるのでしょうか?

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

・変数pの宣言。 ・この2つのpは「同じ」ものなのか?別の関数の別のローカル変数とかいうことは無いか? ・同一だとしたら、この2つの間でどうなっているのか? ・「一致しない」の具体例は? 余談。 rand()を使うなら、(int)(20.0 * rand() / RAND_MAX) * 1000 + 1の方が乱数の質がよいです。 理由は探してみてください。

speeeeeeedd
質問者

お礼

pは同じグローバル変数で、上記は全て同じ関数内です。更に上と下の間でpをいじったりはしていません。 多分下のp(毎回値が変わるので。しかも上のpとは異なる)も乱数になっているのかと思います。 乱数の質の件は参考に致します。 回答ありがとうございます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

できる限り「問題の発生する完全なプログラム」を出してください. これでは「途中で p を書き換えてるんでしょ」で終わっちゃう. あと, グローバル変数の是非はおいても名前は考えてほしい. 可視範囲が狭いなら適当でもそれなりに何とかなるけど (単なる「forループのカウンタ」なら i で十分だ), グローバル変数に「p」なんて名前はあり得ない. 意味の分かる名前にすべき.

speeeeeeedd
質問者

お礼

すみません、、、あまりに拙いプログラムで恥ずかしくて抜粋しました。 尚、質問の件は自己解決致しました。 もっともっと初歩的な箇所を見落としていました。 グローバル変数名については貴重なご意見ありがとうございます。 今後気をつけていきたい次第です。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

乱数と言ったって、 > p=rand()%20*1000+1; とした時に変わるだけで、他に変更するようなことをしなければ、そんなことにはなりません。 > CString time; > p=rand()%20*1000+1; > time.Format(_T("%d"),p/1000); > CString strp; > strp.Format(_T("%d"), p/1000); と5行が連続で処理しているのでしょうか?それとも > CString time; > p=rand()%20*1000+1; > time.Format(_T("%d"),p/1000); ※ pを変更しないはずの処理 > CString strp; > strp.Format(_T("%d"), p/1000); となっているのでしょうか? また、これは、シングルスレッドでしょうか? 別の処理が割り込まないように制御されたものでしょうか? 間に別の処理が入る可能性のあるのでしょうか? timeに使ってるので、タイマーに関連してそうですが、そうすると、タイマーで定期的に値が変わったりしませんか? なんにせよ、変数名が本当にpなら、そんなグローバル変数は間違いのもとです。 名前は別にするとして、グローバル変数を使わない方法も考えた方がいいと思います。

speeeeeeedd
質問者

お礼

5行は連続ではなく、後者のほうです。 一応処理は上から順に逐次処理していく形になっておりますが、、、 前半の後はif文分岐が10くらいあり、そのひとつが後半になっています。 もしかしたらそこに問題があるんですかね? 後たまたま変数名をtimeにしただけでタイマ-は使ってはいません。 一応他の関数でもpを用いるのでグローバル変数にしたのですが、、、やはりローカルにしたほうが良いのでしょうか?

関連するQ&A

  • 乱数に関する質問

    (使ってる開発環境は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; };

  • 乱数

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

  • 乱数について

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

  • 乱数発生

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

  • 乱数について・・・

    (1)1,2,3,4の整数のどれかを乱数で発生させる方法 (2)0~1までの実数を発生させる方法 を教えていただけないでしょうか?(a.outするたびに値が変わってほしいです。) ※一応、下のプログラムにあるように実行するたびに違う乱数がanswerに入るようにはできたのですが、いまいち理解できていません。軽い説明や参考URLなども教えてもらえたら助かります。 よろしくお願いします。 #include<time.h> int main() { unsigned short time_a,time_b; unsigned long answer; time_a = time(NULL); time_b = time_a; srand(time_b); answer = rand(); printf("答えは = %d\n",answer); }

  • 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; }

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

    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回ともに異なる数を得ることが出来る方法がありましたら教えて頂きたいと思います。

  • プラスの乱数の合計とマイナス乱数の合計の商の値を上げるには?

    プラスの乱数の合計とマイナス乱数の合計の商の値を上げるには? 以下ルールで乱数を使ってプラスの乱数とマイナス乱数の合計の商の値をいかにして上げられるかの検証をやってます。 しかし今の私の知恵では商の値を動かす事ができません。 乱数の範囲は-10から+10とします。 乱数を発生させ与えられた値が仮得点として加算されます。 そして任意のロジックで仮得点を正式な得点として加算します。 その任意ロジックは例えば仮得点がマイナス幾つになったら、またはプラス幾つなったら仮得点を仕切り正式な得点として加算するというもの。 但し、仮得点がマイナスの場合、プラスの場合とそれぞれ1つ以上の仕切りロジックを作らなければならない。 そして仮得点がマイナスとプラスの場合に分けそれぞれ別の変数に加算する。 (もし仮得点がマイナスなら変数mynas プラスなら変数plus) 仕切られた仮得点は0に戻る。 最終的にその計算を数多く繰り返してプラスの乱数とマイナス乱数の合計の商の値を出力する訳です。 文章では分かりにくいので、私が行いたい検証をプログラムソース風に明記します。 //仕切りロジック 例えのロジックとして仮得点が+100以上、-100以下になったら、仕切って+100、-100をそれぞれ正式得点に加算する処理を1000回繰り返し最後にプラスの変数÷マイナスの変数の商を出力 //仮得点がマイナスの場合、プラスの場合とそれぞれ1つ以上の仕切りロジックを作らなければならない(変数plusのみまたは変数mynasのみのロジックは不可) //仮得点加算変数 KariTokuTen=0 //プラス得点加算変数 plus=0    //マイナス得点加算変数 mynas=0 for(i=0;i<1000;i++){ //whileループを止める為の変数 ex=0; while(ex==0){   //乱数(-10..10)を発生させ仮得点として加算(乱数の範囲変更不可) KariTokuTen=KariTokuTen+rand(-10..10) if( KariTokuTen >= 100){ //仮得点が100以上になったら100をプラス変数に加算 plus=plus+100 //仮得点を初期化 KariTokuTen=0 //whileループを止める変数 ex=1 } else if(KariTokuTen <= -100){ //仮得点が-100以下になったら-100をマイナス変数に加算 mynas=mynas-100 //仮得点を初期化 KariTokuTen=0 //whileループを止める変数 ex=1 } } //加算処理が終了しプラス得点とマイナス得点の商の値を出力 (この商の値を上げたい) print plus/mynas 私としてはルールを守った上で上述のロジックに限らず色々なロジックを発案し(プラスの変数÷マイナスの変数)の商の値がより高くなようにしたいです。上記のロジック以外にも色々と試してみましたが商の値は+-1ばかりで全くコントロールできません。 何卒ご教授宜しくお願いします。

  • 型変換??

    int RANDOM_FUNCTION( int n ) { return (int)( rand() / (float)RAND_MAX * n ); } について Q1.この関数は0からn-1までの乱数を作るそうなのですが,何故ですか? 0<=rand()<=RAND_MAX だから0からnまでの乱数ができるような気がするのですが. Q2.RAND_MAXではなく(float)RAND_MAXとキャストしてある意味は何ですか? Q3.srand((unsigned)time(NULL));と srand((unsigned int)time(NULL));では何か違いますか? Q4.  static int first = 0; if (first == 0){ srand((unsigned)time(NULL)); first = 1; } という処理でsrand((unsigned)time(NULL));は最初の一回だけ呼び出されるようになっているようですが,この部分を srand((unsigned)time(NULL)); というように毎回呼び出すようにするとどうなりますか? 一回呼び出すだけで乱数系列の初期値が呼び出される時に変化しているのですか? Q5.この関数とは関係ない質問ですが,例えば a:int型 b:int型 c:double型 d:float型 のとき d = a / b + c という演算は 1 a:int型,b:int型より(a / b)の結果はint型(小数になった場合は小数点以下切り捨て) 2 (a / b):int型,c:double型,int<doubleより (a / b + c)の結果はdouble型 3 d:float型,『=のあるときは左辺の型に合わせる』よりdはfloat型 というように型変換されているという解釈でいいのでしょうか??

専門家に質問してみよう