アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語で0~Nまでの乱数を発生させる場合、

srand((unsigned) time(NULL));
rand()%N;

とやりますよね。
このやり方だと、発生する乱数はRAND_MAX以下しかできません。
RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?

A 回答 (7件)

(RANDMAX + 1) * rand() + rand()


0~1073741823

↓訂正↓
    • good
    • 2

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/ …
    • good
    • 0

個人的には、


(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/ …
    • good
    • 0

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

    • good
    • 0

#2の方に横槍失礼しますが


RAND_MAXは再定義するものではありません。
コンパイラ間の互換性をもたせる為に定義されているだけです。



RANDMAXが32767の場合

Nが30000
rand()%N
としたとき0~2767のが2倍2768~29999が発生する確率より2倍高くなってしまいます。
その為、RANMAXに近い値は偏りがでるので注意してください。

>RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?
#1の方もおっしゃっていますが、複数個つなげればいいでしょう。色々方法はありますが
RANDMAX * rand() + rand()
とすれば
0~1073709056の値が返ってきます。
    • good
    • 0

うーん規定値以上の値を返す擬似乱数関数は無かったと思いますので・・・。



もし3以上の数を表示させたいのであれば
srand((unsigned) time(NULL));
rand()%10+3;
これで3以上で10以下なのですが。

RAND_MAX以上の数を表示させたい場合は
RAND_MAXの再定義が必要ですのでたとえば100万までをランダム最高としたいんだったら。
#define RAND_MAX (100*10000)
と定義しなおして(自分のソースで)
rand()%最高値にしたい数+最低地にしたい数;
と行えばいいんじゃないんでしょうか?
    • good
    • 0

乱数の有効桁数が足りないのですね、


それなら乱数を複数個くっつけたらどうですか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!