web-dev-qa-db-ja.com

Javaでの真のランダム生成

私はMath.random()のjavadocを読んでいて、randomがsuedorandomであることを確認しました。

環境温度、CPU温度/電圧などのランダム変数に従って乱数を生成するライブラリ(特にJava)はありますか?

23
Gareth

チェックアウト http://random.org/

RANDOM.ORGは、大気ノイズによってランダム性を生成する真の乱数サービスです。

Javaインターフェースするためのライブラリはここにあります: http://sourceforge.net/projects/trng-random-org/

28
Greg Dean

あなたの質問があいまいで、回答がいたるところにあります。

(私が推測しているように)システムのランダム性のソースに依存するRandom実装を探している場合は、javax.crypto.SecureRandomがそれを行います。 Java.securityファイルでのSunセキュリティープロバイダーのデフォルト設定には、次のものが含まれています。

#
# Select the source of seed data for SecureRandom. By default an
# attempt is made to use the entropy gathering device specified by
# the securerandom.source property. If an exception occurs when
# accessing the URL then the traditional system/thread activity
# algorithm is used.
#
# On Solaris and Linux systems, if file:/dev/urandom is specified and it
# exists, a special SecureRandom implementation is activated by default.
# This "NativePRNG" reads random bytes directly from /dev/urandom.
#
# On Windows systems, the URLs file:/dev/random and file:/dev/urandom
# enables use of the Microsoft CryptoAPI seed functionality.
#
securerandom.source=file:/dev/urandom

これをさらに真にランダムなものでオーバーライドすることについて本当に質問している場合は、このプロパティを変更するか、別のSecureRandomを使用することで実行できます。たとえば、独自のPRNGを持っている nCipher nShield などのHSMモジュールに裏打ちされたJCEプロバイダー、またはスレッドで言及されている他のソリューションを使用できます。

21
ykaganovich

素早く汚い:

public static int generateRandom() throws IOException
{
    int num = 0;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    for (int i = 0 ; i < Integer.SIZE ; i++)
    {
        System.out
          .println("Flip a fair coin. Enter h for heads, anything else for tails.");

        if (br.readLine().charAt(0) == 'h')
        {
            num += Math.pow(2, i);
        }
    }

    return num;
}
9
Adam Jaskiewicz

これらのランダムデータのソースを利用するには、何らかのハードウェアアクセスが必要になるため、このようなライブラリは、純粋なJavaを使用して移植可能に書き込むことはできません。

ただし、プラットフォームに依存するコードを記述して、ランダムデータのプラットフォームソースを読み取ることができます。 Linux(およびおそらく他のUnixライクなシステム)の場合、/dev/random 例えば。

また、 SecureRandom クラスを確認してください。必要なものがすでに含まれている場合があります。

8
Joachim Sauer

「真の」乱数が本当に必要であることを確認してください。ランダム性の物理的な原因を測定する必要があり、測定プロセスにはある程度の偏りがあります。一部のアプリケーションでは、「疑似」乱数が「真」の乱数よりも実際に適しています。それらはより良い統計的特性を持つことができ、それらをより速く生成することができます。一方、注意しない場合は、疑似乱数ジェネレータを使用して 足元で自分を撃つ を使用できます。

7
John D. Cook

J ava暗号化アーキテクチャ には、暗号的に強力な乱数が必要です。 @sauaが言及する SecureRandom クラスが含まれています。

4
tvanfosson

明確にするために:宇宙に存在する唯一のTRUEランダムジェネレーターはQuantum Random Bit Generatorです。生成されたビットが完全にランダムであることを保証する他のメカニズムはありません。これは、結果を予測できない場合でも、将来その結果を予測できないという保証がないためです。

量子ランダムビットジェネレーター(QRBG121)は、高速の非決定論的ランダムビット(数値)ジェネレーターであり、そのランダム性は、半導体のフォトニック放出の量子物理プロセスの固有のランダム性と、それに続く光電効果による検出に依存します。このプロセスでは、光子はランダムに、互いに独立して1つずつ検出されます。検出された光子のタイミング情報は、ランダムな2進数(ビット)を生成するために使用されます。この方法のユニークな特徴は、1つの光子検出器のみを使用してゼロと1の両方を生成することです。その結果、バイアスが非常に小さくなり、コンポーネントの変動と経年変化に対する耐性が高くなります。さらに、個々の光子の検出は光電子増倍管(PMT)によって行われます。固体光子検出器と比較して、PMTは信号対ノイズ性能が大幅に優れており、不要な相関の原因となる可能性のあるアフターパルスが現れる確率がはるかに低くなっています。

ここに例の詳細情報: http://random.irb.hr/

3
Marek

true乱数ジェネレーターはありません。これらはすべて、何らかの方法で乱数を計算する確定的手順に依存しているため、生成された数値がどのように表示されても真のランダム分布に従うために、それらは隠された、そして非常に複雑なパターンの一部である可能性があるため、それらは Pseudo-Random です。ただし、独自の乱数ジェネレーターを実装できます。 Numerical Recipes in C、Second Edition-Section 7 で読み取れる、計算が簡単なニースのメソッドがいくつかあります。 HTH

3
Josef

ほとんどの目的では、疑似乱数で十分です。単純な乱数が必要な場合、つまり。 30%の時間でこれを行うと、シードとしてのタイムスタンプが必要になります。デッキをシャッフルするなど、これが安全な乱数でなければならない場合、シードをもう少し慎重に選択する必要があります。安全なシードを作成するための優れたソースがあります。

シードを使用する理由は、アルゴリズムによって生成された乱数の同じシーケンスを「リコール」できるようにするためです。そのための非常に優れたシナリオは、ある種の確率的シミュレーションを実行していて、特定の実験を繰り返したい場合、同じシードを使用するだけです。

PRNG Javaにバンドルされているものよりも良い場合は、 Mersenne Twister をご覧ください。

2

ウィキペディアの引用:ジョンフォンノイマンは、「算術手法を使用して乱数を生成する人は誰でも罪の状態にある」と有名に述べています。

1
tuinstoel

大学では、ランダムジェネレーターを実装するタスクがありました。私はこのような乱数ジェネレータを作成しました:デスクトップウィンドウを作成し、ユーザーにウィンドウ上のランダムな場所をクリックするように依頼しました。クリックするたびに、クリックした点の座標を取得しました。それはかなりランダムだと思います。

1
Serik

これも参照SO question: Alternative Entropy Sources

私は HotBits を数年前に発見しました-数字は放射性崩壊から生成されたもので、純粋にランダムな数字です。

Javaにアクセスするためのライブラリ randomx があります

1日にダウンロードできる数には制限がありますが、RNGの本当にランダムなシードとしてこれらを使用することは常に面白がっていました。

1
Ken Gentle

私が知る限り、彼らはマシンのtimeで動作します...!

乱数の用途

乱数は何千年もの間使用されてきました。コインを投げるかサイコロを振るかに関わらず、最終結果をランダムなチャンスに任せることが目標です。コンピューターの乱数ジェネレーターは似ています—予測できないランダムな結果を達成しようとする試みです。

これは真の乱数を作ることは可能ですか?

はい、そうです !

「真の」乱数を生成するために、コンピューターはコンピューターの外部で発生する物理的な現象を測定します。

より日常的な例では、コンピューターは大気ノイズに依存するか、単にキーボードのキーを押す正確な時間を予測できないデータまたはエントロピーのソースとして使用できます。たとえば、コンピュータが午後2時のちょうど0.23423523秒後にキーを押したことに気づく場合があります。これらのキーの押し下げに関連する特定の時間を十分に取得すると、「真の」ランダムを生成するために使用できるエントロピーのソースが得られます。数。

NSA and Intel’s Hardware Random Number Generator

開発者にとって物事を簡単にし、安全な乱数を生成するために、IntelチップにはRdRandと呼ばれるハードウェアベースの乱数ジェネレーターが含まれています。このチップは、プロセッサ上のエントロピーソースを使用し、ソフトウェアが要求したときにソフトウェアに乱数を提供します。

ソース: HowToGeek?

Androidで乱数を生成する必要がある場合に備えて、加速度計のデータを使用して、物理ベースの真の乱数を取得します:)

0
Disco4uf