2

Javaで乱数を生成する方法がいくつかあります

それらの1つはこれです:

Random rand=new Random();
int randomInteger=rand.nextInt();

私の質問は次のとおりです。次の乱数を予測できますか?


4つの回答後に編集:

私の本当の問題はこれです:

私はスネーク ゲーム (Linux ではニブル) に取り組んでおり、ヘビが動くようにプログラムしています。リンゴが次に現れる場所を予測できるかどうかを知りたいです。

出来ますか?

4

5 に答える 5

5

を呼び出したときに何が返されるかを正確に知っていればSystem.currentTimeMillisnew Random()new Random()new Random(System.currentTimeMillis()) 、それを予測できるだけでなく、絶対に知ることができますこれは、疑似乱数ジェネレーターのシードを設定するのショートカットであるためです。(まあ、それは私が最後にソースを見たときのことです。ドキュメントは実際にそれを使用する必要があるとは言っていません。)使用したシードを知っている場合new Random()。疑似乱数ジェネレーターは決定論的です。シードがわかれば、シーケンスもわかります。更新: Java 6 のソース [Java 7 のソースが手元にありません] を見ると、デフォルトのシードは、使用時に増加するシード番号とSystem.nanoTime. したがって、これらの両方を知る必要があります。バーを上げます。

によって使用されるシードが発生した時点での正確な値がわからない場合、次の値がどうなるかを予測することは非常に困難です。それが疑似乱数発生器のポイントです。不可能だとは言いません。ある程度の自信を持って行うのは、本当に、本当に難しいです。System.currentTimeMillis()new Random()new Random()


質問の編集後の更新:可能ですが、非常に困難であり、プレーヤーがゲームでスコアを改善できるようにするという点では、無視してかまいません.

于 2012-04-07T14:25:53.463 に答える
2

Random クラスによって生成される「乱数」はアルゴリズムによって生成されるため、実際には疑似乱数です。そうです、理論的には、次の数字を予測することができます。ただし、Random が生成した 1 つの数字、または一連の数字を知っていても、次の数字を予測するには十分な情報ではありません。また、Random オブジェクトが使用しているシードを知る必要があり、その疑似乱数生成アルゴリズムに従う必要があります。

「乱数」の反復可能なセットが必要な場合は、Random のインスタンスを作成するときに独自のシードを指定できます。

Random rand = new Random(1234); // Replace 1234 with any value you'd like

同じシードで Random をインスタンス化するたびに、同じ一連の数値が得られます。したがって、たとえば、シードを使用して Random をインスタンス化し、返される数値のリストを出力する小さなコマンド ライン プログラムを作成してから、コード内で同じシードを使用して Random をインスタンス化することができます。次に、コードが受け取る番号とその順序を知ることができます。これはデバッグに非常に便利です。

于 2012-04-07T14:28:35.290 に答える
1

コンピューターのような決定論的なデバイスでは、実際に乱数が存在することはありません。しかし。

暗号的に安全な乱数が必要な場合は、SecureRandom を使用してください: http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html

Random は決定論的アルゴリズムを使用します。

Random の 2 つのインスタンスが同じシードで作成され、それぞれに対して同じ一連のメソッド呼び出しが行われる場合、それらは同一の数列を生成して返します。

http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#Random

于 2012-04-07T14:30:17.353 に答える
0

基本的に、乱数発生器のシードがわかっていれば、シーケンス全体を確実に予測できます。そうしないと、いくら数値を生成しても、次の数値を正確に予測する方法はありません。

セキュリティのために数字が予測できないことに依存している場合java.secure.SecureRandomは、java.util.Random.

于 2012-04-07T14:31:32.820 に答える