• ベストアンサー

乱数の生成方法

乱数を生成するソースコードを探しています rand関数で生成される乱数はよい乱数ではないようで それ以外でいい乱数を生成する方法はどのようなものがあるのでしょうか また、実装したソースコードのサンプルがあればWEBページなどを教えていただきたいです

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

  • ベストアンサー
回答No.3

何に使いたいかというのをまず聞きたいですね。数値計算用途なら、メルセンヌツイスターをお勧めしますし、暗号用途ならライブラリーを使って簡単にやるならarc4randomそうでないならyarrowをお勧めします。 メルセンヌツイスターは次のページから詳しい情報やソースコードが手に入ります。 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html メルセンヌツイスターはPython、C++0x (予定)、R言語など様々な言語で標準の乱数作成方法として実装されています。 arc4randomはBSD系のOSには標準で入っていますし、そうでない場合もlibbsdなどでインストールできることがあります。これを使えるならこれを使うとよいでしょう。 ソースコードは例えばこんな感じですね。 (arc4と名前に持っているだけあって、opensslのrc4のライブラリを使っています) http://www.jp.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/crypto/openssh/openbsd-compat/bsd-arc4random.c?rev=1.3&content-type=text/plain&logsort=cvs arc4randomが使えない環境でお手軽に暗号用途の乱数を作る場合は、メルセンヌツイスターで出た結果のsha1を計算するという方法が提案されています。 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/faq.html yarrowアルゴリズムはFreeBSDの疑似乱数発生デバイスの中で使われているアルゴリズムで、入力エントロピーの品質を評価して安全性が高く、エントロピーを加えなくても長く乱数を発生させることができます。 http://www.schneier.com/yarrow.html ...というわけで、用途に応じて適切なものを選んでみてください。

nanako_04
質問者

お礼

ありがとうございます。大変参考になりました。

その他の回答 (2)

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

http://www001.upp.so-net.ne.jp/isaku/rand.html あたりがいろんな乱数について詳しいです。

nanako_04
質問者

お礼

ええと、乱数について詳しいとおっしゃってますが、これは単に特定の乱数の普及を促進するための宣伝ではないでしょうか。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

C++でいいならBoostライブラリにさまざまな生成方法と分布で擬似乱数を生成するrandomが含まれています。 ライブラリ入手先: http://www.boost.org/ 使い方: http://www.kmonos.net/alang/boost/classes/random.html

nanako_04
質問者

お礼

参考にします。ありがとうございます。

関連するQ&A

  • MATLABの乱数生成関数 rand( ) について

    一様乱数を生成する関数rand()について  ・Y = rand(n);  ・rand('state',sum(100*clock));   Y = rand(n); という2つのやり方があるようなのですが,以下のmatlabの関数の説明 のページをみても2つの違いが理解できません. http://infoshako.sk.tsukuba.ac.jp/ShakoDoc/MATLAB5/jhelp/techdoc/ref/rand.html どういう違いがあるのでしょうか? また,この関数は[0,1]の一様乱数としていますが,[-a,a]みたいに範囲指定はできないのでしょうか? 回答よろしくお願いします.

  • 超幾何分布に従う疑似乱数の生成について

    今、超幾何分布に従う疑似乱数を生成するコードをScilabで書こうとしています。しかし、Scilabには超幾何分布に従う疑似乱数の関数が実装されていません。有識者の方で、わかる方がいましたら教えてください。 ソースコードに関してはC言語、Basic、Scilabのどれかで教えていただけたら、助かります。また書籍をご存じなら、書籍名を教えてください。 よろしくお願いいたします。

  • 乱数生成について

    VisualBasic2010を使用しています。 コード内に複数回、乱数を生成しています。 普段は始めだけRandomizeして、Rnd関数を使用していて、毎回違う乱数を生成させているのですが、 今回は毎回同じ乱数を生成させたいのですが、どうやったらできるでしょうか? シード値をどうこうするとは、わかったのですがやり方がわかりません。 わかる方、どうぞよろしくお願いします。

  • 文字列から乱数を作る方法について。

    最近PHPの勉強をしており、文字列をhash関数の入力として用いて、0~100の乱数を生成する機能を実装しました。 ですが、出力結果に偏りがみられます。 再現性を残して、できるだけ偏りの無い乱数を作りたいと考えています。 何かいいアイデアやサイトを御存知でしたら教えてください。 現在は以下のようなコードで乱数を生成しています。 $seed = hash("sha512",$setstring); $seed = $seed[0].$seed[1].$seed[2]; $seed = intval($seed,10); srand($seed); for($i=0; $i<10; $i++){ $lv = rand()%100; }

  • 正規乱数とは

    学校の宿題ですがまず正規乱数の発生は2つの方法があるというのですが、意味がわかりません。 正規乱数でなんですか。 なぜ12個足して6をひくのですか。 また逆関数法の=NORMSINV(RAND()) てどういう意味ですか。 正規乱数の発生 1 一様乱数を12個足して6を引く方法 =RAND()+RAND()+・・・・+RAND() - 6 12個分 2 逆関数法 =NORMSINV(RAND())

  • 乱数について

    rand関数で乱数を作る時に、この関数は0~RAND_MAXの擬似乱数を作りますが、 この擬似乱数を特定の範囲だけ作ることは可能なのでしょうか? 例えば、30~70までの擬似乱数だけを作るとかです。 よろしくお願いします。

  • 完全な乱数を生成する方法

    C言語で乱数を生成するときに、今まで srand(time(NULL)); を使用していたのですが、それだと1秒以内に複数の処理を行った際に、 同一の乱数が生成されてしまいます。 時間にとらわれずに完全にランダムな数字を出現させるにはどのような方法を取るのが簡単なのでしょうか? よろしくお願いします。

  • メルセンヌツイスターによる乱数の使い方

    メルセンヌツイスターによる乱数を生成したいのですが、下記コードにすると、mt_rand関数を呼ぶたびにシードが初期化され他乱数が生成されます。 やりたいことは、main関数で一度シード101で初期化した後は、mt_rand関数内では、初期化することなく継続した乱数を生成したいのです。 そのためa_mt_rand関数のようにすると、mtが定義されていないとなるエラーとなります。 namespaceの問題と思うのですが、色々試してみましたが、できませんでした。 どのようにすればできるでしょうか。 vc++11、windows11 使用 参考サイト C++ 乱数ライブラリ std::random の使い方 リンクはうまく貼れませんでした。 #pragma hdrstop #include <iostream> #include <stdio.h> #include <random> using namespace std; void mt_rand(void); int main(int argc, char *argv[]) { int ptr; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("ptr=%d\n",ptr); mt_rand(); } void mt_rand(void) { int ptr=0; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("%d\n",ptr); } void a_mt_rand(void) { int ptr=0; ptr = rand100(mt); printf("%d\n",ptr); }

  • Mathematicaによる乱数生成について

    Mathematicaを用いて正規分布に係数をかけた物に従った乱数を生成したいのですが、ヘルプを調べても分からず困っています。 具体的に行いたいことは、 RandomReal[1/3*NormalDistribution[0,10], 100]          ~~~ のような事です。 正規分布の確率密度関数(平均0,分散10)に係数(ここでは1/3)をかけた分布に従う乱数を100個生成したいということです。 どなたか解決方法をご存知の方がいらっしゃいましたらよろしくお願いいたします。

  • 桁数の多い乱数の生成法

    50桁から300桁といった桁数の多い乱数の生成法を探しています。 乱数生成アルゴリズム等を使用するのは、ネットで調べてわかるのですが、具体的な方法がほとんど載ってませんでした。 詳しくのっているページがあれば、教えてください。