2

重複の可能性:
乱数ジェネレーターはどのように機能しますか?

Cコンパイラは、乱数生成関数で次に生成する数値をどのように決定しますか?たとえば、指定された範囲の間に常に新しい乱数を生成します。それはどのように行われますか?

4

6 に答える 6

1

これは、問題の疑似乱数ジェネレーター(PRNG)の特定の実装によって異なります。非常に多くのバリエーションが使用されています。

一般的な例は、線形合同法(LCG)のファミリーです。これらは漸化式によって定義されます。

   X n + 1 <-aX n + c(mod m)

したがって、PRNGからの新しい各サンプルは、前のサンプルと定数a、c、およびmによってのみ決定されます。ここで説明するように、a、c、およびmの選択が重要であることに注意してください。

LCGは非常にシンプルで効率的です。これらは、標準ライブラリによって提供される乱数ジェネレーターによく使用されます。ただし、統計的特性が低く、ランダム性を高めるために、より高度なPRNGが推奨されます。

于 2012-10-14T18:26:58.490 に答える
1

関数を呼び出すたびに状態を保持し、状態を変更することで、次の番号を生成します。このような関数は、疑似乱数ジェネレータと呼ばれます。 PRNGを作成する古い方法は、線形合同法です。これは非常に簡単です。

static int rand_state;
int rand(void)
{
    rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff;
    return rand_state;
}

ご覧のとおり、この方法では、前の番号がわかっている場合、シリーズの次の番号を予測できます。より洗練された方法があります。

さまざまなタイプの疑似乱数ジェネレータが特定の目的のために設計されています。遅いが、どのように機能するかを知っていても予測が難しい安全なPRNGがあります。また、優れた分布特性を備えているため、モンテカルロシミュレーションの作成に役立つMersenneTwisterのような大きなPRNGがあります。

経験則として、線形合同法はゲームを書くには十分ですが(モンスターが与えるダメージの大きさ)、シミュレーションを書くには十分ではありません。プログラムに貧弱なPRNGを選択した研究者のカラフルな歴史があります。結果として、彼らのシミュレーションの結果は疑わしいものです。

于 2012-10-14T18:28:39.297 に答える
1

これはコンパイラではなく、疑似乱数 (真の乱数ではない!) を生成する関数を備えた C ライブラリです。

通常、これには線形合同ジェネレータが使用されます。

于 2012-10-14T18:29:00.087 に答える
1

C コンパイラはその決定を行いません。次の乱数はアルゴリズムによって異なります。乱数の生成は簡単な作業ではありません。を見てみましょう

于 2012-10-14T18:29:14.477 に答える
0

stackoverflow には、これに関する多くの質問があります。ここにいくつかあります。これらから助けを得ることができます。

rand() の実装

Cのランド関数

ランドの実装

于 2012-10-14T18:32:22.130 に答える
0

これは実際には非常に大きなトピックです。重要なことのいくつか:

  • 乱数の生成は、コンパイル時ではなく実行時に行われます。
  • ランダム性を提供するための戦略は、アプリケーションに大きく依存します (または依存する必要があります)。たとえば、指定された範囲全体に均等に分散された一連の値が必要な場合は、線形合同ジェネレーターなどのソリューションが使用されます。アプリケーションがセキュリティ/暗号化に関連している場合、値がランダムに分散され、予測不可能であるというより強力なプロパティが必要になります。
  • 主な課題は、「実際の」ランダム性を取得することです。これを使用して、疑似乱数ジェネレーターをシードできます (実際のランダム性を任意の量の使用可能なランダム性に「ストレッチ」します)。一般的な手法は、予測不可能なシステム状態 (たとえば、マウスの位置やキーを押すタイミングをサンプリングする) を使用してから、疑似乱数発生器を使用してシステム全体にランダム性を提供することです。
于 2012-10-14T18:33:26.903 に答える