• ベストアンサー

乱数の最大値

C言語で0~Nまでの乱数を発生させる場合、 srand((unsigned) time(NULL)); rand()%N; とやりますよね。 このやり方だと、発生する乱数はRAND_MAX以下しかできません。 RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?

  • repu
  • お礼率48% (26/54)

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

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

(RANDMAX + 1) * rand() + rand() 0~1073741823 ↓訂正↓

その他の回答 (6)

回答No.7

RAND_MAX以上の値を発生させたいならば断然MT(メルセンヌツイスター)をお勧めします。 私自身も課題等で使わせてもらっていますが、アルゴリズムの完成度が高くかなり真乱数に近い疑似乱数を発生してくれます。下に書いてあるサイトからソースをとってきて貼り付けて動かしてみるといいと思います。genrand_int31()なんかは[0,0x7fffffff]の範囲(16進表示で設定してある)で発生することが可能みたいです。つまり0~2147483647までの乱数を表示できます。ぜひ試してはどうでしょうか? 使い方としてはmain関数内にprintf("%10.8u ", genrand_int31());と書くだけで表示してくれるでしょう。後は回数を自分で設定してみたりしてください。

参考URL:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
  • fo-o
  • ベストアンサー率50% (4/8)
回答No.6

個人的には、 (double) rand() / (RAND_MAX+1) * (n+1); で少数以下切捨て まあこれもあんまりnがでかいと駄目だけど… Mersenne Twister Home Page ていうHPに新しい乱数発生アルゴリズムを使った関数が紹介されてます。ソースコードが拝めるのでちょっといいかも。個人的には理解できなかったけど。(汗

参考URL:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

用途にもよりますが, 標準の rand を捨ててそれに代わるものを探した方がいいと思います.

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

#2の方に横槍失礼しますが RAND_MAXは再定義するものではありません。 コンパイラ間の互換性をもたせる為に定義されているだけです。 RANDMAXが32767の場合 Nが30000 rand()%N としたとき0~2767のが2倍2768~29999が発生する確率より2倍高くなってしまいます。 その為、RANMAXに近い値は偏りがでるので注意してください。 >RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか? #1の方もおっしゃっていますが、複数個つなげればいいでしょう。色々方法はありますが RANDMAX * rand() + rand() とすれば 0~1073709056の値が返ってきます。

回答No.2

うーん規定値以上の値を返す擬似乱数関数は無かったと思いますので・・・。 もし3以上の数を表示させたいのであれば srand((unsigned) time(NULL)); rand()%10+3; これで3以上で10以下なのですが。 RAND_MAX以上の数を表示させたい場合は RAND_MAXの再定義が必要ですのでたとえば100万までをランダム最高としたいんだったら。 #define RAND_MAX (100*10000) と定義しなおして(自分のソースで) rand()%最高値にしたい数+最低地にしたい数; と行えばいいんじゃないんでしょうか?

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

乱数の有効桁数が足りないのですね、 それなら乱数を複数個くっつけたらどうですか。

関連するQ&A

  • 乱数で交互に偶数、奇数が、、、。

    C言語で、確率2分の1で0と1を 出そうとして、rand,srand,timeを使って やってみたのですが、ちょうど、0と1が 交互に出てしまいます。何度やっても 変わりません。ただ、1と0が逆になる だけ。こんな感じで0101010101か1010101010 つまり、乱数で奇数と偶数が 交互に発生しているみたいうまくいきません。 なにか、別の方法ありますか? --------------------------------------- srand((unsigned int)time(NULL)); s=rand()%2 これで、やってます。

  • 乱数について

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

  • 乱数について・・・

    (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); }

  • 型変換??

    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型 というように型変換されているという解釈でいいのでしょうか??

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

  • 乱数

    #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { double n,end; printf("いくつ以上の値が出たら終了しますか?:"); scanf("%lf",&end); srand((unsigned)time(NULL)); for( ; ; ){ n=(double)rand(); printf("%f\n",n); if(n>=end) break; } return 0; } これなんですが、このまま実行すると.00000になってしまいます。 自分的には0.~にしたいのですが、どう変えればいいでしょうか? 回答お願いします。

  • 乱数発生

    #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 初心者です。 表題のように、unsigned longのスケールの乱数をつくりたいんですが、以下のように記述すると値がいつも同じになります。この理由と、正しく動作するにはどう直したらいいのか教えてください。 unsigned long ul; ul = 4294967295UL * rand() / (RAND_MAX + 1); 値は常に131071でした。

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

    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言語で乱数を扱うときの

    乱数を初期化するために srand((unsigned)time(NULL)というのを使いますが これはどういう意味を表してるんでしょうか? timeは1970年から経過した時間を表していることは分かりますし unsignedは符号ビットをなくして表せる数を倍にしてることも分かりますが、 NULLって何のために書いてあるのでしょうか?

専門家に質問してみよう