• 締切済み

乱数発生

自分で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くらいまでの乱数(すべての数が同じ割合で出現し、かつ法則のないように)を作りたいのです。  でも、起動したときには同じ乱数が発生することにならないように時間を使えばいいと聞いたのです。  どうでしょう?

関連するQ&A

  • 乱数を発生させるプログラムを教えてください。

    タイトルのままなのですが、1から100までの乱数を発生させるプログラムを知りたいです。 乱数をxとおくと、xの値は、0<x<1の範囲内でお願いします。 C言語で、rand関数を用いて、どうかお願いします。

  • エクセルの乱数発生についてお尋ねします。

    rand()のような関数のファミリーを使うと乱数が発生できます。 そこで、ある程度広がりを持ったシート内に乱数を発生させました。 それは満足していますが、マウスで処理をしたり、何かをアクティブにしたり非アクティブにしたりする操作をすると、乱数が毎回発生してしまいます。シートの数字がパッと変わるのです。 乱数を発生させるタイミングがコントロールできていないわけですが、どのように考えたらいいでしょうか。1回乱数を発生させたら固定したままで、”では、ここで乱数を発生させる”というコマンドの出し方なのですが。エクセルではどうしたらいいでしょうか。

  • 擬似乱数発生

    ‐πからπまでの40000個の擬似乱数を発生させたいと考えています。今のところc++もしくはエクセルを用いて行おうと思っていますが、どちらでも可能ですか?もし、可能なら方針もしくはヒントをよろしくお願いします。

  • 乱数発生ルーチンの使い方について

    数値計算において一様乱数を発生させるルーチンがいろいろあります。ソースが公開されているものやコンパイラが提供したりするものです。それらを利用する場合、乱数発生のシーズ(種)を与えてそれに応じて動作するというものが多いだろうと思います。そこで質問ですが、10000個の乱数を1回発生させる場合と100個の乱数を100回発生させる場合とで乱数の感じがかなり違います。いずれの場合も100×100の2次元データ(エクセルのシート状)として出力して作図したらその違いが簡単に分かります。この違いの原因はシーズの与え方が1回と100回という違いだろうと思います。100回のシーズの与え方にパターンが出来てしまうからだと思われます。例えば時間を使ってシーズを与えなおすことも考えられますが、今時のPCだとあっという間なのでシーズが同じだから、同じ乱数が100個できてしまいます。乱数を繰り返し発生させるときにその繰り返しの中でパターン化された乱数にならないように発生させる方法がないでしょうか。シーズが要らない乱数生成ルーチンとかですが。あるいはシーズをランダムに取得する方法が含まれたルーチン(シーズがないように見える)などです。あるいは本当にないものなど。メルセンヌツイスターはどうなのでしょうか。一応、フォートランでの利用を考えていますが、言語依存の問題ではないかもと思いますが。 よろしくお願いします。

  • 疑似乱数の発生

    Z80で疑似乱数を発生させたいのですが、どのようにすれば良いでしょうか? あと、一般的な疑似乱数の発生のさせ方についても教えていただければ有り難いです

  • 発生乱数の偏りを無くしたい

    エクセルで=RAND()を用いてA1~A100のセルに100個乱数を発生させたときに(乱数は0~1の幅)、0~1の値を偏り無く発生させることは可能でしょうか?? 発生した100個の乱数をコピーして形式を“値”にして貼り付けてその100個の乱数の平均や中央値をみてみると0.5にはならないことから疑問に思いました・・・。 ご存知の方アドバイスよろしくお願いします。

  • Excel2007 一様乱数 指数乱数を用いてポアソン乱数を発生させる

    指数乱数を用いてポアソン乱数を発生させるにはどうすれば良いのでしょうか。

  • 乱数の発生方法

    こんにちは! いつも大変参考にさせていただいております。 どうか教えていただきたい事があります。 数学は大の苦手で、学生時代からほとんど勉強してこなかっただけに、 数学の本を読んでも、今回の問題とどのように関係しているのかがわからず、お手上げ状態です。 実行したいのは、確率により乱数を発生させたいです。 たとえば、0から2の乱数を発生させるにあたり、 0の発生は50%、 1の発生は25%、 2の発生は25%、 というように、発生する確率を設定したいと思っています。 確率の本を読んでみたのですが、入門書には確率の求め方は載っていたのですが、それをどのように利用したらいいのかわかりません。 このような乱数の発生のさせかたは可能でしょうか? また、どのようにしたらいいのでしょうか? 教えてください。。。

  • 乱数について

    こんばんは。 何度も申し訳ありませんが、今回は乱数について教えてください。 LinuxでCを勉強しているんですが、 randで乱数を発生させることはできたんですが、 そのプログラムを何度実行させても 出てきた乱数は同じ値なんです。 プログラム内で例えば10こ乱数を発生させたとすると 違うものが出ます。 しかし、もう一度そのプログラムをはしらせると 前回と全く同じ並びで同じ数が出るのはどうしてでしょうか? 言ってる意味わかっていただけましたでしょうか? 宜しくお願いします。

  • C++で乱数発生

    C++で[0,1]区間を100等分した値、つまり0.00以上始まり1.00以下の乱数を発生させ、値ごとに何個現れたかをカウントするには、どうしたらよいのか教えて下さい。私はプログラミングの知識や本等一切ありません。できるだけ詳しく教えてほしいです。

専門家に質問してみよう