1

Java でプログラミングしているゲームがあり、ユーザーのブラウザーで Javascript を使用して、Java ゲームで使用されるシャッフルが本物であることを Web サイトで確認できるようにしたいと考えています。

Collections.shuffle(array, seed); を使用しています。

同じ結果を得るために、JavaScriptと同じ順序の配列に同じシードを供給できるようにしたいと考えています。

Java での Collections.shuffle のソースは次のとおりです。

public static void shuffle(List<?> list, Random rnd) {
 int size = list.size();
 if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
     for (int i=size; i>1; i--)
         swap(list, i-1, rnd.nextInt(i));
 } else {
     Object arr[] = list.toArray();

     // Shuffle array
     for (int i=size; i>1; i--)
         swap(arr, i-1, rnd.nextInt(i));

     // Dump array back into list
     ListIterator it = list.listIterator();
     for (int i=0; i<arr.length; i++) {
         it.next();
         it.set(arr[i]);
     }
 }
}

編集:Java用に別のシャッフルメカニズムを使用することもできます。Java と Javascript で同じシードを使用できる限り

4

2 に答える 2

2

私はあなたができるとは確信していません。

Java は、48 ビットのシードを持つ確立されたアルゴリズムを使用して、疑似乱数を生成します。第 2 に、その数値に別の数値をシードして別のパターンを生成することができます (Random同じシードを使用して を 2 回呼び出すと、同じパターンが生成されます)。

Javascript では jump から乱数をシードすることはできません。内部で実装されている乱数アルゴリズムは、Java で使用されているアルゴリズムとは異なる場合があります。

2 つの異なる場所でランダムな操作を実行する目的はわかりませんが、1 つにまとめてみませんか? Java にコレクションのランダム化を処理させ、代わりに Javascript にその順序付けを中継させます。

于 2013-02-28T04:48:39.617 に答える
0

md5 ハッシュ アルゴリズム (またはその他) を使用すると、どのプラットフォームでも同じ結果が得られます。または、独自のハッシュ関数を発明しますが、均等に分散する必要があります。それは非常に複雑な作業です。ハッシュ関数の結果を再帰的に使用して、次の乱数を取得できます。これにより、どのシステムでも同じ一連の乱数が得られます。その結果に基づいて、シャッフル アルゴリズムを実装します。シャッフル アルゴリズムの実装は、Google で見つけることができます。

于 2013-02-28T06:18:53.357 に答える