導入する
通常のコードで使用される乱数が疑似乱数であることは誰もが知っていますが、コンピューターが真の乱数を生成できるかどうか疑問に思ったことはありませんか?実際、物理的な方法を使用するなど、それは可能です:
しかし、
疑似乱数
したがって、私たちのほとんどは疑似乱数を好みます。次に、疑似乱数がどのように生成されるかを理解しましょう。
まず、関数f(x)f(x)を設計します。f (x )(再帰式とも呼ばれます)、次にx 1x_1を与えますバツ1、出力x 2 x_2バツ2、すなわちx 2 = f(x 1)x_2 = f(x_1)バツ2=f (x1)、次に順番に進みます、x 3 = f(x 2)x_3 = f(x_2)バツ3=f (x2)、…、xn = f(xn − 1)x_n = f(x_ {n-1})バツn個=f (xN - 1)。このようにして、n − 1n-1が得られます。n−1つの乱数(与えられたx 1 x_1バツ1ここでは数えません)。この時点で、疑似乱数の生成は完了です。
ただし、上記のプロセスにはいくつかの問題があることがわかります。
- 初期値x1x_1が2回与えられている限りバツ1が同じである場合、生成される乱数シーケンスは同じです。
- 生成される乱数シーケンスには周期的な現象があります。[0、31] [0,31]が生成される場合は、考えてみてください。[ 0 、3 1 ]乱数、生成された乱数シーケンスに2つの同一の数が現れると、xi = xi + T x_i = x_ {i + T}バツ私=バツI + T、次にTT関数f(x)f(x)が適用されるため、 Tは周期です。f (x )によって得られる後続の結果はまったく同じです。
上記の2つの質問は、説明するのに十分です。このメソッドによって生成される乱数は、疑似乱数です。
上記の2番目の質問を使用して、いくつかの概念を追加します。
期間:上記のTTなどの周期的な現象を持つ疑似乱数の数T。なぜなら、乱数列のxix_iはバツ私和 x i + T x_{i+T} バツI + Tのすべての乱数はループし続け、合計n個あります。
最大容量:ループが発生する前に生成された乱数の最大数。前の例の最大容量はi + T i + Tです。私+T。
これまでのところ、コンピューターで乱数を生成する原理は理解していると思いますが、この再帰関数f(x)f(x)はまだ指定していません。f (x )。
乗法的合同
このメソッドの再帰式は次のとおりです
。xi+ 1 =(A xi)mod(M)x_ {i + 1} =(Ax_i)mod(M)バツI + 1=(A x私)m o d (M )
したがって、問題は初期値x 1x_1にあります。バツ1、AAAとMMMの設定について。