Game Coding Complete(4th Edition)を読んでいて、第3章の「GrabBagofUsefulStuff」セクションの「Pseudo-RandomTraversalofaSet」パスを理解するのにいくつか問題があります。
CDプレーヤーの「ランダム」ボタンがどのように機能するのか疑問に思ったことはありませんか。同じ曲を2回再生することなく、CDのすべての曲をランダムに再生します。これは、ゲーム内のプレーヤーが同じ機能を何度も見る前に、オブジェクト、エフェクト、キャラクターなどのさまざまな機能を確認するための非常に便利なソリューションです。
この説明の後、Javaで実装しようとしたが、正常に複製できなかったC++での実装について説明します。また、それがどのように機能するかについても簡単に説明していますが、私もわかりません。
私は同様の質問に対するこのStackOverflowの回答を見つけましたが、残念ながら回答の例へのリンクは無効であり、ウィキペディアの記事も理解していません。
明確にするために、私はコレクションをランダムに並べ替える方法を探していません。繰り返す前に、コレクションから要素を1回だけランダムに選択する方法を探しています。
誰かがこの動作がどのように機能するかを説明し、Javaで例を提供できますか?ありがとう!
[編集]私が話していることを説明するのに役立つように、ここに実装の抜粋があると便利かもしれないと思いました。
仕組みは次のとおりです。スキップ値は、ゼロより大きい3つのランダムな値を選択することによって計算されます。これらの値は2次の係数になり、定義域の値(x)はセットの序数に設定されます。
Skip = RandomA * (members * members) + (RandomB * members) + RandomC
このスキップ値を使用すると、このコードを使用して、疑似ランダムな順序でセット全体を1回だけトラバースできます。
nextMember += skip;
nextMember %= prime;
スキップの値は、セットのメンバーの数よりもはるかに大きいため、選択した値はランダムにスキップしているように見えます。もちろん、このコードはwhileループ内にあり、選択した値がセットよりも大きいが素数よりも小さい場合をキャッチします。