- ベストアンサー
RAND_MAXの最大値について
/* YouTubeのC入門系動画に乱数の話があり真似てみたところ、動画では2147483647まで出力されているのですが、 私の環境では32767までしか出力されません。 この最大値の違いは、どうして出るのでしょうか? また、私の環境で最大値2147483647まで出せるようになりますか?または、出せる方法があるなら教えてください。 よろしくお願いします。 */ cpu i5 3570 memory 32GB OS Windows 10 pro 64bit Microsoft Visual Studio Community 2015 */ #include <stdio.h> #include <stdlib.h> int main(void) { printf("MAX : %d\n", RAND_MAX); return 0; }
- Black_Skal
- お礼率100% (12/12)
- C・C++・C#
- 回答数3
- ありがとう数6
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
値は処理系依存です。下記によればVisual Cだと0x7FFFということなので、 https://msdn.microsoft.com/ja-jp/library/2dfe3bzd.aspx ・Visual C以外のCを使う ・自分でそういうランダム関数を作る のどちらかしかありません。
その他の回答 (2)
- maiko0333
- ベストアンサー率19% (840/4403)
間違っているね。 #include <stdio.h> #include <stdlib.h> int main(void) { printf("MAX : %ld\n", LONG_MAX); return 0; } これでいいはず。32ビット(4バイト)と64ビット(8バイト)の違いでした。
お礼
久々に見たらお礼していなかったので・・・ ものすごく遅ればせながらですが、ありがとうございます
- maiko0333
- ベストアンサー率19% (840/4403)
intは処理系に依存して4ビットか8ビットと差があります。 longにすれば問題は解決します。
お礼
久々に見たらお礼していなかったので・・・ ものすごく遅ればせながらですが、ありがとうございます
関連するQ&A
- rand関数について
rand関数で取得した乱数を入力し、入力した逆の順番に表示しなさい、という問題があるのですが。一度乱数のプログラムを作り、その後逆に表示するプログラムというのは分かるのですが、そのあとがどうしても分かリません。 一般に、この場合は先ず。 #include <stdio.h> #include <stdlib.h> int main(void) { int i; for(i=1;i<==10;i++){ printf("%d",rand()%10+1); { return 0; } の表示をして、新たに逆にする表示をすると思うのですが、どのパターンを使うのが無難なのでしょうか? できれば 式を含めてお願いします。
- ベストアンサー
- C・C++・C#
- 毎回違う乱数を生成するにはどうしたらいいでしょうか
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; } お忙しい中、教えていただけたらうれしいです。
- ベストアンサー
- その他([技術者向] コンピューター)
- 0と1のファイルへの書き込み、出力
c言語で0と1の乱数を生成し、ファイルに出力したいのですが、出力がおかしくなってしまいます。 正しく0と1をファイルに書き込み、出力するにはどうしたらいいでしょうか。 わかる方いらっしゃいましたら教えてください。 お願い致します。 #include<stdio.h> #include <stdlib.h> #include <time.h> #define max 3000000 #define nrand(n) (int)((double)n*rand()/RAND_MAX) /* 0以上n未満の整数を返す */ int main() { FILE *Wf; char W_filename[20]; int *W=(int *)malloc(sizeof(int) * max); printf("入力ファイル名 : "); scanf("%s",W_filename); if( ( Wf=fopen(W_filename,"w") ) == NULL ) printf("ファイルを開けません\n"); else { for(i=0;i<max;i++) { W[i]=nrand(2); fprintf(Wf,"%d ",W[i]); } } fclose(Wf); free(W); } 出力が ‰‱‱‰‱‱‰‱‱‰‰‰‰‱‰‱‰‱‰‰ のようになってしまいます。 Wにはちゃんと0か1が入っているみたいなのですが・・・
- ベストアンサー
- C・C++・C#
- 標準正規分布の乱数
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・C++・C#
- この円を分割して。。
#include <stdio.h> #include <time.h> #include <stdlib.h> #define MAX 10000 void main(void) { int i; float x1, x2, en, sum=0.0, s; srand( (unsigned)time( NULL ) ); for(i=0;i<MAX;i++) { x1=((float)rand()/(float)RAND_MAX); x2=((float)rand()/(float)RAND_MAX); if(en=(x1-0.5)*(x1-0.5)+(x2-0.5)*(x2-0.5)<=(0.5)*(0.5)) { sum++; } } s=sum/MAX; printf("円の面積:%15.6e\n",s); } 円の面積を求める方法です。がもう少し精度をあげる工夫をしようと思うのですが、円を4分割した第一象限の部分に乱数をとばしその面積を求め、4倍することで求めたいのですがどうプログラムを変えたらいいか教えてください。
- 締切済み
- C・C++・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でやると乱数が同じ値しか出てきません。 教えてください。
- ベストアンサー
- C・C++・C#
- C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると
C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると結果が130固定となってしまいます。 #include <stdio.h> #include <stdlib.h> int main(void){ int x; x = rand(); printf("%d",x); return 0; } 使っているコンパイラはBorland C++ 5.5.1です。何か間違いでもあるのでしょうか?よろしくお願いします。
- ベストアンサー
- C・C++・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以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。
- ベストアンサー
- C・C++・C#
- g++のrand
VisualStudioで正常に動いていた乱数を用いたプログラムをLinuxのg++でコンパイルするとコンパイルはできるが正しい挙動をしないという問題に出くわしました。 調べていったところ、 float r = (float)rand() / (RAND_MAX+1); という処理のRAND_MAX+1がまずかったようです。 プリントして確認したら print(RAND_MAX) … 2147483647 print(RAND_MAX+1) … -2147483648 となっています。 オーバーフローしたためであろうということは検討がつくのですが、 理屈がはっきりわからず、すっきりしない感じです。 なぜ、RAND_MAXに+1をすると-2147483648になるのか(intが符号付だから??)、なぜwindows(Visual Studio)だと問題なかったのに、Linux(g++)だとダメなのか、 非常に初歩な質問かもしれませんが、どなたかご解説をお願いします。
- 締切済み
- C・C++・C#
お礼
久々に見たらお礼していなかったので・・・ ものすごく遅ればせながらですが、ありがとうございます