なぜこのコードが奇妙な結果を出すのですか?だからランダム?

私はいくつかの乱数を生成し、コンソール上にプリントアウトするコードを持っています。しかし、私はそれが印刷するパターンに興味があります。例えば、

import java.util.*;
public class Test
{
    public static void main(String[] args)
    {
        Random random = new Random(-6732303926L);
            for(int i=0;i<10;i++)
                System.out.println(random.nextInt(10)+" ");    
    }
}

Result : 0 1 2 3 4 5 6 7 8 9 - Every number in new line.

そして、このコードを少し変更したら!好きな、

import java.util.*;
public class Test
{
    public static void main(String[] args)
    {
        Random random = new Random(-6732303926L);
            for(int i=0;i<10;i++)
                System.out.println(random.nextInt(11)+" ");    
    }
}

Result : 8 9 2 2 10 3 8 7 0 10 - Every number in new line.

ランダムではない0123456789の理由は何ですか?

0
Ohhhがもう1つ見つかりました - javacodegeeks.com/2011/10/weird-funny -java.html
追加された 著者 TeaCupApp,
元のソースを信用するのはいいでしょう
追加された 著者 Tomasz Nurkiewicz,
はい、JCG.comはさまざまなブログから記事を転載していますが、記事の最後には元の出典が記載されています。
追加された 著者 Tomasz Nurkiewicz,

6 答え

0123456789もランダムですが、この場合、14235682907と出現する可能性があります。これは疑いの余地はありません

基本的に虫歯に遭った。最初のケースで次の 10の数字を印刷すると、明白な順序は保持されません。

それはコインを反転させるようなものです - パターンHHHHHHHHは正確なパターンHHTHTTHHと同じように現れます。 8ステップのいずれかに50%の確率で間違っているように、それぞれの起きる確率は1/2 8 です。しかし、最初のパターンは壊れているように見えますが、2番目のパターンは壊れているようです。

10
追加された

私はそれがランダムだと思う... random 関数のために特定のシードを使用している。あなたはちょうど0から9の数字を順番に与える種を見つけました。

編集:明らかに、これはアルゴリズムです:

java.util.Randomクラスは、一般に線形合同ジェネレータ(LCG)と呼ばれるものを実装します。 LCGは、本質的に次の形式の式です。    i + 1 =(a * number i + c)mod m

Source: here

7
追加された
JavaMexはすべてを知っています。彼はまたStackExchangeのメンバーですo)um @Neil Coffee私は彼の名前だと思います。彼はJavaとRandomをよく知っています。あなたのソースをとてもうまく共有するためにあなたに投票してください。
追加された 著者 Ellie Kesselman,

ランダムクラスは擬似乱数ジェネレータです。したがって、本当にランダムではなく、最初のシード値に対して実行された数学演算に依存します。したがって、特定のシードは特定の(潜在的に興味深い/楽しい)シーケンスを生成します

3
追加された
はい、特に、特定の種子がある種の楽しいが、必ずしも "重要な"配列ではないという事実に関してです。暗号の観点から、動機がない限り、「重要」ではなく、私たちの範囲外です。私はあなたの答えを楽しんだ、それは私を笑顔にさせた。有難うございます。
追加された 著者 Ellie Kesselman,

ランダムにシードを作成すると、特定の動作が保証されます。特に、同じシードを持つランダムの2つのインスタンスを作成すると、常に同じように動作します。誰かがこの特定の種子を最初の10個のnextInt(10)とともに使用すると、そうした一見順序付けられたシーケンスを作成することがわかりました(私は推測します)。このシーケンスは、擬似ランダムupdonの最初の作成ですが、再現することができます。少しでも何かを変更すると、別の結果が得られます。

2
追加された

シーケンスの理由は、次の方法を使用して、予測可能で反復可能なシーケンスでRandomを推測可能にすることによってソフトウェアをテストできるようにするためです。特定の長いシードパラメータがRandomコンストラクタのパラメータである場合、インスタンス化されたRandomオブジェクトは、次のメソッドによって同じシーケンスの値を返すことになっています。これはjava.util.Randomの意図的な機能です。

java.util.Randomには2つのコンストラクタがあります。

Random()

そして

Random(long seed)

The constructor without a long integer seed uses the system time for creating a seed value for the pseudo random number generator. No two instantiations of Random will use the same seed そしてyou should get a very good pseudo-random sequence. A Random instantiation using the constructor without a seed creates an instance with unpredictable sequences of values that will be pseudo-random.

The constructor with a seed value is intended only for making Random deterministic with predictable sequences using its next methods. The typical use of a seed is for software test purposes where results must be predicable そしてrepeatable. Every instance of Random that uses the same long seed integer will create the same sequence of results every time. The particular long you used causes the sequence to be 0 1 2 3 4 5 6 7 8 9 over そしてover again when getting one of 10 integer values using nextInt(10) method. This そしてother predictable sequences that are repeatable every time software executes are very useful for testing software そしてare not meant for creating unpredictable pseudo-random sequences.

2
追加された

あなたが本当の乱数を取得したい場合は、乱数はあなたがそれに与えるシードに基づいて、シードとして時間関数を使用し、あなたは本当の乱数シリーズを取得します。

1
追加された