2012-04-07 13 views
2

それらのjavaの乱数はJavaでは実際には予測できませんか?

1で乱数を生成するためのいくつかの方法があるがこれです:

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

今、私の質問はこれです:私たちは、次の乱数を予測することができますか?

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

私はスネークゲーム(Linuxの中ニブル)に取り組んでいると私は今、移動するヘビをプログラミングしています4つの解答後に編集


私はリンゴが現れる次の場所を予測することが可能かどうかを知りたい。

は可能ですか?

+0

あなたの編集に対応するために私の答えが更新されました。 –

答えて

5

new Random()を呼び出したときに返される数字がSystem.currentTimeMillisであることがわかっている場合は、それを予測することはできますが、それは絶対にわかります。これは、new Random()new Random(System.currentTimeMillis())のショートカットであり、擬似ランダムジェネレータのシードを設定するためです。 (まあ、それは私が最後にソースを見たときにしたものです;ドキュメントdon't actually sayそれを使用しなければなりません)あなたはnew Random()が使用されている種族を知っています。擬似乱数ジェネレータは決定的です。シードを知っていれば、シーケンスを知ることができます。 更新:Java 6のソース[Java 7のソースが手元にない]を見ると、デフォルトのシードは、使用時にインクリメントされるシード番号+ System.nanoTimeの組み合わせです。だから両方を知る必要があります。バーを上げます。

new Random()new Random()で使用種を発生したとき、それは次の値がどうなるかを予測するために確かに非常に難しいだのとあなたがSystem.currentTimeMillis()の正確な値を知らないない場合。これが疑似乱数発生器のポイントです。私はそれが不可能だとは言わない。ちょうど本当に、本当に何度も信頼することは大変です。質問の編集後


更新:それは可能だが、非常に、非常に難しい、との方法でそうすることの点では、プレイヤーがゲーム内で自分のスコアを向上させることができるようになる、私は思いますあなたはそれを無視できると言います。

2

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

「ランダム」の繰り返し可能なセットを希望する場合は、ランダムのインスタンスを作成するときに独自のシードを指定できます。

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

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

+0

本当に乱数が必要な場合は、http://www.random.org/のようなインターネットアクセス可能なサービスがあり、大気騒音のような自然現象に基づいて乱数のリストを照会することができます。 – MattK

1

コンピュータのような決定論的なデバイスには実際には乱数はありません。しかし。

あなたは、暗号のSecureRandomを使用し、乱数を確保したい場合:ランダムの2つのインスタンスが同じシード、との同じシーケンスを使用して作成されている場合

http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html

ランダム決定論的なアルゴリズムを使用していますメソッド呼び出しはそれぞれに対して行われ、同一のシーケンスを生成して返します。基本的に

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

+0

実装では、許可されているカバーの下でPRNGを使用していないことがわかっている場合のみ。 –

0

あなたは乱数ジェネレータのシードを知っていれば、あなたは確実にシーケンス全体を予測することができます。そうしないと、生成する数字の数にかかわらず、次の数字を正確に予測する方法はありません。

セキュリティ上予測できない数字に頼っている場合は、java.util.Randomではなくjava.secure.SecureRandomを使用する必要があります。

0

他の人がこの質問に答えたので、開始種を知っていればjava.util.Randomのランダム性を予測することは可能です。

Linux系のシステムで作業している場合は、これらの特別なファイル/dev/randomdev/urandomを見てください。これらのファイルからの読み取りは「より良い」乱数を返すと言われており、ランダム性はキーボードの動作、マウスの動きおよび他のいくつかのエキゾチックな要因によって決まります。

詳細はWikipediaページをご覧ください。このページには、同等のAPIがWindowsに存在することも記載されています。

関連する問題