質問で何を参照するつもりなm
のか、または「一連の数字」をどのように定義しているのかわかりません)。ただし、数のサイクルを取得する1つの方法は、次の形式の再帰(または反復)を使用することです。
next = f(current)
一部の関数の場合f。たとえば、線形合同RNGは反復を使用します。
x = ( a · x + c ) mod m where 0 < a, c < m
常に0からm-1までのすべての値を生成するわけではありませんが、特定の状況下では次のように生成されます。
c and m are relatively prime
a - 1 is divisible by every prime factor of m (not including m)
if m is divisible by 4, a - 1 is divisible by 4.
(これはハル・ドーベルの定理です。)
a、c == 1は、任意のmについて上記の基準を満たしていることに注意してください。さらに、mが素数の場合、aとcの任意の値が基準を満たし、mが2の累乗である場合、a == 1mod4およびc==1 modとなるように、基準は任意のa、cによって満たされます。 2.ただし、mの特定の値(例:6)の場合、機能するaの値は1のみです。
これは「ステートレス」とは見なされないかもしれませんが、厳密にステートレスな解決策はないと思います。たとえば、次のような関数を探すことができますf
。
f(0), f(1),... f(m-1)
の順列です
0, 1, ..., m-1
f(i)
の連続する値を呼び出すことによってサイクルを生成できるようにしますi
。i
しかし、それはまだ状態です。最後に使用した値を覚えておく必要があるためです。