• 締切済み

乱数発生

自分でC++で乱数を発生させたいのですが、どのようなアリゴリズムで発生させればいいか教えてください。(時間を使うといいと聞きましたがどのように使うのでしょう)

みんなの回答

  • Nandayer
  • ベストアンサー率47% (20/42)
回答No.7

    RSA に利用するということは、素数判定に使うのでしょうか?そうであれば、あまり質の高くない( mickjey2 さんの使っておられる意味で)乱数発生法でなくてもよいように思います。(素人なので保証はできませんが。)  したがって、線形合同法や C の標準関数でよさそうです。 C の標準関数を使うのであれば hiromichel さんのやり方で、srand を最初の一回だけ、rand を例えば 400 回使えばよいでしょう。標準関数については C の本できちんと確認すべきだと思います。  「時間を使う」というのは hiromichel さんのやっておられるように、種(seed)の初期値に使うのです。プログラムの起動ごとに、初期値として別の値を設定しなければ、毎回同じ乱数が発生してしまいますから。(書いてるうちに mickjey2 さんの詳しいお答えが追加されてしまった。)  以上の答えで不足であれば、次の点をはっきりさせれば、具体的なプログラムを誰かが書いてくれるでしょう。    ・発生させる乱数の値の種類(実数/整数/正の整数)と範囲    ・ 400 ぐらいの大きさの配列に入れればよいこと  基本的にはこのような考えでよいでしょうけど、RSA に使うんなら多倍長計算が必要なのでは? その場合は複数の基本型の乱数から、多倍長の乱数を構成するのでしょうか。

noname#11476
noname#11476
回答No.6

>でも、起動したときには同じ乱数が発生することにならないように時間を使えばいいと聞いたのです。 疑似乱数発生ルーチンは普通 seed という数字をもっています。 で、使用する前に seed で初期化します。 同じ seed だと同じ乱数データがでてきます。異なる乱数データがほしいときにはseedを変えます。 このseed にパソコンの時間+日付(パソコン内部ではある時点を基準に秒単位の整数で表しています)の数値を使えば起動の度に異なる乱数列が得られると言う意味です。 これを使わなくてもファイルなどに過去のシードを記憶しておいて、一つずつインクリメントしていくのでもちゃんと使えます。 やり方は用途によっていろいろでしょう。 まあ日付+時間データを使う方がお手頃ですけどね。(私ももっぱら普通はこれです) RSAのプログラムですか、、、手元にないので未確認ですが NRinC にもでていたような気がします。 (いや、別の本だったかもしれません)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.5

こんにちわ。 私は昔、(rand() * rand()) % 1000 とやって、擬似乱数の偏りを 調整した事があります。 → 結構お手軽です。

noname#11476
noname#11476
回答No.4

どの程度の乱数が望みなのでしょうか。厳密に言うとこれは擬似乱数といいます。 大抵はライブラリにある乱数で事足りると思います。これらは一応はある程度でたらめ度合いを考えられて作られています。 しかし、本当に質の良い擬似乱数をお望みであれば、自作したほうがよいでしょう。 その場合は、Numerical Recipes in C という本をご覧下さい。 質の高い乱数ルーチンの作り方とサンプルプログラムが載っています。 注意深く作られていない乱数ジェネレータだとたとえ線形合同法などなどの手法を用いても、最悪の質になることがあります。 (かくいう私も、モンテカルロシミュレーションで普通のライブラリの乱数を使って、それでトラぶったことがあります)

maroniichann
質問者

お礼

 ありがとうございます。参考にさせていただきます。  実は今RSAのプログラムを取り組んでいて、400くらいまでの乱数(すべての数が同じ割合で出現し、かつ法則のないように)を作りたいのです。  でも、起動したときには同じ乱数が発生することにならないように時間を使えばいいと聞いたのです。  どうでしょう?

回答No.3

たとえば、整数の乱数で(1~10)を発生させるなら... //時間で乱数の種を発生させる srand((u_int)time(NULL)); //乱数を発生 randomValue = rand()%10+1; としてみたらどうでしょうか??

maroniichann
質問者

お礼

 ありがとうございます。  実は今RSAのプログラムを取り組んでいて、400くらいまでの乱数(すべての数が同じ割合で出現し、かつ法則のないように)を作りたいのです。  でも、起動したときには同じ乱数が発生することにならないように時間を使えばいいと聞いたのです。  どうでしょう?

  • minimum
  • ベストアンサー率46% (6/13)
回答No.2

よくは知りませんが 線形合同法、Knuthの乱数発生法、M系列乱数、Wichmann-Hillの乱数発生法 みたいなのがあるそうですよ。 このキーワードで検索してみてはどうでしょう?

maroniichann
質問者

お礼

 分かりました。  参考にさせていただきます。

回答No.1

 前提条件がよくわかりませんが、時間を使うということであれば、「秒」を「ある数」で割った時の「余り(範囲は0~ある数-1になる)」を使用すれば良いのではないでしょうか。

maroniichann
質問者

お礼

 ありがとうございます。  実は今RSAのプログラムを取り組んでいて、400くらいまでの乱数(すべての数が同じ割合で出現し、かつ法則のないように)を作りたいのです。  でも、起動したときには同じ乱数が発生することにならないように時間を使えばいいと聞いたのです。  どうでしょう?