9

だから私はC++に不慣れで、いくつかのことを学ぼうとしています。そのため、私は乱数ジェネレーター(必要に応じてRNGまたはPRNG)を作成しようとしています。私はRNGの基本的な知識を持っています。たとえば、シードから始めて、アルゴリズムを介してシードを送信する必要があります。私が立ち往生しているのは、人々がどのようにして前述のアルゴリズムを思い付くかということです。

これがシードを取得するために必要なコードです。

int getSeed()
{
    time_t randSeed;
    randSeed = time(NULL);
    return randSeed;
}

これで、C ++にはビルド済みのRNGがあることがわかりましたが、他の人の作業をコピーして理解しようとするだけでなく、学習したいと思っています。

ですから、誰かが私を読んだり、このためのアルゴリズムを考え出す方法の例を見せてくれたりすることができれば、私は大いに感謝します。

4

4 に答える 4

5

まず、明確にするために、思いついたアルゴリズムは疑似乱数ジェネレーターであり、真の乱数ジェネレーターではありません。アルゴリズムを作成する(つまり、関数を作成する、つまり一連のルールを作成する)ので、乱数ジェネレーターは最終的にそれ自体を繰り返すか、ランダムではない同様のことを行う必要があります。

真の乱数ジェネレーターの例は、自然界からランダムなノイズをキャプチャしてデジタル化するものです。これらには以下が含まれます:

http://www.fourmilab.ch/hotbits/

http://www.random.org/

ホワイトノイズ(またはランダム性に関するその他の手段)を生成する物理的な機器を購入して、それをデジタルでキャプチャすることもできます。

http://www.lavarnd.org/

http://www.idquantique.com/true-random-number-generator/products-overview.html

http://www.araneus.fi/products-alea-eng.html

疑似乱数ジェネレーターに関して、学ぶのが最も簡単なもの(そして平均的な一般の人がおそらく自分で作ることができるもの)は線形合同ジェネレーターです。残念ながら、これらは最悪のPRNGの一部でもあります。

優れたPRNGを決定するためのガイドラインには、次のものがあります。

  1. 周期性(利用可能な数の範囲はどれくらいですか?)
  2. 連続番号(同じ番号が2回続けて繰り返される確率はどれくらいですか)
  3. 均一性(特定のサブ範囲から別のサブ範囲と同じように数値を選択する可能性がありますか)
  4. それをリバースエンジニアリングすることの難しさ(それが本当にランダムに近い場合、誰かがそれが生成した最後のいくつかの数に基づいてそれが生成する次の数を理解できないはずです)
  5. 速度(新しい数値を生成できる速度はどれくらいですか?5回または500回の算術演算が必要ですか)
  6. 私が行方不明になっている他の人がいると確信しています

現在、ほとんどのアプリケーション(つまり、crptographyではない)で優れていると考えられている最も人気のあるものの1つは、MersenneTwisterです。リンクからわかるように、これは単純なアルゴリズムであり、おそらくわずか30行のコードです。ただし、これらの20行または30行のコードを最初から作成しようとすると、多くの頭脳とPRNGの研究が必要になります。通常、最も有名なアルゴリズムは、PRNGを数十年にわたって研究してきた教授または業界の専門家によって設計されています。

PRNGを勉強して、自分で試してみてください(KnuthのArt of ComputerProgrammingまたはNumericalRecipesを出発点として試してください)が、一日の終わりにこれをすべてレイアウトしたかっただけです(PRNGがあなたの人生の仕事)他の誰かが思いついたものを使うほうがはるかに良いです。また、これらの方針に沿って、歴史的にコンパイラやスプレッドシートなどは、ほとんどの数学者が優れたPRNGと見なすものを使用しないため、高品質のPRNGが必要な場合は、標準ライブラリを使用しないでください。 C ++、Excel、.NET、Javaなどで、それらが何を実装しているかを調査するまで。

于 2011-05-02T12:48:16.543 に答える
3

線形合同法が一般的に使用されており、Wikiの記事でかなりよく説明されています。

于 2011-05-01T21:50:43.720 に答える
3

ジョン・フォン・ノイマンを引用するには:

ランダムな数字を生成する算術的方法を検討する人は、もちろん罪の状態にあります。

これは、クヌースの著書「The Art of ComputerProgramming」の第3章から引用したもので、入手可能な主題の最も網羅的な概要である必要があります。そして、あなたがそれを読んだら、あなたは疲れ果てます。また、独自の乱数ジェネレーターを作成したくない理由もわかります。

于 2011-05-01T21:57:03.280 に答える
0

正しいソリューションは要件を最もよく満たし、あらゆる状況の要件は一意になります。これはおそらくそれについて行く最も簡単な方法です:

  • 「実際の」ランダムな値が入力された大きな1次元配列を作成します。
  • システム時間で開始インデックスを計算することにより、疑似ランダムジェネレータを「シード」します。
  • 配列を反復処理し、関数を呼び出すたびに値を返します。
  • 終わりに達したらラップアラウンドします。
于 2011-06-28T12:39:16.597 に答える