- ベストアンサー
0~100の乱数を効率良く作る方法はないでしょうか?
0~100の乱数を効率良く作る方法はないでしょうか? とある高負荷な処理の裏側で 1秒間に0~100の乱数が2~3000ずつ必要で、 できるだけ処理を軽くしたいと思っております。 現在は1個1個rand()で生成しているのですが、 多少数値にムラが発生しても構わないので 出来るだけ軽く、大量に乱数を作り出す 手法や設計の思想とでもいえるものは無いでしょうか? 何か教えて頂けますと幸いです。 よろしくお願いいたします。orz
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1の回答を寄せた方と同じで、乱数表を使いますが、私なら、サイズ100000000程度のshort型の一次元配列を用意しておいて、処理に入る前にrand()を使って全ての要素に乱数を入れておき、これを順に使います。1秒間に2000-3000個程度を使うのであれば、約10時間ほどもちます。足りなくなったら先頭から再利用します。 ところで、よほど遅いCPUでない限り、3000個程度の乱数をrand()で生成するのには1ミリ秒もかからないでしょうから、これを速くしたところで全体の負荷はほとんど軽減できません。 乱数の生成を高速化するよりも、「高負荷な処理」を見直す方が効果が期待できるでしょう。
その他の回答 (2)
- titokani
- ベストアンサー率19% (341/1726)
私も3000個程度なら、rand()で十分に思えます。 ひとまず、1秒間に何個の乱数が生成できるのかを測定してみてはどうでしょうか? あと、randの使い方は正しいですよね?
お礼
ご回答ありがとうございます。 測定した所相当軽いと解り拍子抜けしておりました。 ありがとうございました。
- Interest
- ベストアンサー率31% (207/659)
多少むらが発生しても良いなら、乱数のテーブルを先に作っておいてはどうでしょうか。 例えば、 #define TABLE_NUM 3000 // 用意する乱数テーブルの数 #define RAND_RANGE 100 // 乱数の範囲 int randTable[ TABLE_NUM ][ RAND_RANGE ]; // 乱数テーブル void init_rand_table(int table[ TABLE_NUM ][ RAND_RANGE ]) { // ここで乱数テーブルを初期化する。 } 実際に乱数テーブルを使用するときは、こんな感じです。 int index = rand() % TABLE_NUM; // 0-TABLE_NUM の乱数を使って使用するテーブルを決める。 int i; for(i=0; i<RAND_RANGE; i++){ value = randTable[ index ][ i ]; // これで作成済みの乱数を取得する。 あとは取得した乱数を使うだけ。 } これなら処理が格段に軽くなります。ただし、メモリを多少食います。 乱数テーブルに必要なメモリは、 次の通り。 sizeof(int) * TABLE_NUM * RAND_RANGE = 4 * 3000 * 100 = 1200000 [Byte] = 1171.875[KB] 多少乱数テーブルがかぶってもよいのなら、TABLE_NUM を小さくすれば必要なメモリは少なくて済みます。
お礼
丁寧なご回答ありがとうございます。 乱数のテーブル、使おうと思います。 ありがとうございましたっ
お礼
なるほど、大胆にそれだけ確保すれば長い時間もつのですね。 BYTE配列なら簡単に1バイトずつ並んで小さくなりそうですし。 方向性的にその方が良い気がしてきました。 速度は私も気になって調べたら加算処理の8倍程度の処理と解り 少し拍子抜けしておりました。 一番負荷がかかる部分について考えるのが先かもしれませんね。 勉強になりました。ありがとうございます。