だから私はあなたが望むのは、できるだけ少ないメモリを使ってセットの順列を生成することだと思います.
まず、メモリがないとできません。最初の文字列には、どの文字列も同じ確率で生成できる関数が必要です。関数が nextString() と呼ばれているとします。状態を何も変更せずに nextString() を再度呼び出すと、もちろん、文字列を生成できるようになります。
そのため、何かを保存する必要があります。問題は、何を保管する必要があり、どのくらいのスペースが必要かということです。
文字列は、0 から X^Y までの数字として表示されます。(aaa=0, aab=1,aac=2...aba=X...) したがって、1 つの文字列をできるだけ効率的に格納するには、lg(X^Y) ビットが必要になります。X = 16、Y = 2 としましょう。次に、文字列を一意に指定するために 1 バイトのストレージが必要になります。
もちろん、最も素朴なアルゴリズムは、生成された各文字列をマークすることです。これには X^Y ビットが必要で、私の例では 256 ビット (32 バイト) です。これはあなたがやりたくないと言ったことです。この質問で説明されているように、シャッフル アルゴリズムを使用できます:順序付きリストからランダムな順序付きリストを作成する(シャッフル アルゴリズムを使用して文字列を生成するときに文字列を保存する必要はありませんが、それでもマークを付ける必要があります)。
さて、問題は、それよりもうまくやれるかどうかです。合計でどれくらい保存する必要がありますか?
最初の呼び出しでは、ストレージは必要ありません。2 回目の呼び出しでは、どちらが以前に生成されたかを知る必要があります。最後の呼び出しでは、どれが最後に残っているかを知る必要があるだけです。したがって、最悪のケースは、途中である場合です。途中で128本の弦が出来上がり、残り128本。生産するために残っているものを知る必要があります。プロセスが完全にランダムであると仮定すると、任意の分割が可能です。(256 が 128 を選択) の可能性があります。これらのいずれかを潜在的に格納できるようにするには、lg(256 choose 128) ビットが必要です。これは、Google 計算機によると 251.67. したがって、あなたが本当に賢いなら、単純なアルゴリズムよりも 4 ビット少ないビットに情報を絞り込むことができます。おそらくそれだけの価値はありません。
非常に少ないストレージでランダムに見えるようにしたい場合は、次の質問を参照してください:(疑似)ランダムな順序で一連の数字を吐き出すアルゴリズムを探しています