私はJavaで乱数を生成したいと思いますが、私はMath.random()のような既存のメソッドを使用すべきですが、私の質問は次のとおりです。私のアプリケーションを実行するたびに? 例:生成された配列である:0.9、0.08,0.6 ので、私はこのシーケンスが、私はこの方法を実行するたびに生成されることを望む...乱数の同じシーケンスの生成
答えて
確かに - ちょうどいつもの代わりにMath.random()
を使用してのRandom
のインスタンスを作成し、
Random random = new Random(10000); // Or whatever seed - maybe configurable
int diceRoll = random.nextInt(6) + 1; // etc
タイミングが予測できなくなるため、アプリケーションに複数のスレッドが含まれていると、処理が困難になることに注意してください。
Random
はpseudo-random number generatorです。言い換えれば、新しい結果を求めるたびに、内部状態を操作してランダムに見えるシーケンスを与えますが、シード(実際には現在の内部州)それは完全に予測可能です。
乱数ジェネレータをシードする必要があります。
Random random = new Random(aFixedNumber);
random.nextInt(); // will always be the same
同じシードを繰り返し使用する例です。
public static void main(String... args) throws IOException {
printDoublesForSeed(1);
printDoublesForSeed(128);
printDoublesForSeed(1);
printDoublesForSeed(128);
}
private static void printDoublesForSeed(long seed) {
double[] doubles = new double[10];
Random rand = new Random(seed);
for (int j = 0; j < doubles.length; j++) {
doubles[j] = (long) (rand.nextDouble() * 100)/100.0;
}
System.out.println("doubles with seed " + seed + " " + Arrays.toString(doubles));
}
プリント
doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93]
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47]
doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93]
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47]
EDITランダムシードの面白い虐待。
public static void main(String ... args) {
System.out.println(randomString(-6225973)+' '+randomString(1598025));
}
public static String randomString(int seed) {
Random rand = new Random(seed);
StringBuilder sb = new StringBuilder();
for(int i=0;i<5;i++)
sb.append((char) ('a' + rand.nextInt(26)));
return sb.toString();
}
プリント
hello world
Math.random
クラスjava.util.Random
の単なるラッパーです。最初にMath.random
と呼び出すと、クラスjava.util.Random
のインスタンスが作成されます。
ほとんどのAPIでは、乱数ジェネレータが公開されていません。これは、ソフトウェアで実装できないためです。代わりに、擬似ランダム番号ジェネレータを使用します。これらのジェネレータは、一連の数式を使用してランダムな数のシーケンスを生成します。これはjava.util.Random
の機能です。しかし、すべての擬似乱数ジェネレータはで始まり、最初にとなる必要があります。同じアルゴリズムを使用し、同じシードを使用する2つの疑似乱数ジェネレータがある場合、同じ出力が生成されます。
デフォルトでは、java.util.Random
は1970年1月1日からのミリ秒をシードとして使用します。そのため、プログラムを起動するたびに、別の番号が生成されます(Javaを1ミリ秒以下で起動するように管理しない限り)。だから、あなたの問題を解決するには、独自のjava.util.Random
インスタンスを作成し、自分でそれをシードすることです:
import java.util.Random;
class ... {
Random randomNumberGenerator = new Random(199711);
public void ...()
{
int randomInt = randomNumberGenerator.nextInt();
double randomDouble = randomNumberGenerator.nextDouble();
}
}
randomNumberGenerator
は常に(限り、あなたはシードを変更しないように、同じ数列を吐き出すます199711
)。
数字をアプリにハードコードします。これはより多くのメモリを必要としますが、はるかに高速です。
乱数を端末に印刷して、コードにコピーして貼り付けてください。
あなたのしたことを説明するコメントを残してください。そうしないと、情報のない読者には黒い魔法のように見えます。
- 1. ダイスローリングプログラムは、すべてのランで乱数の同じシーケンスを生成します
- 2. 乱数生成同じ番号は
- 3. std :: uniform_real_distribution同じ乱数を再生成
- 4. 乱数ジェネレータは、シードされていても同じシーケンスを生成します
- 5. 乱数生成 - 制約付きシーケンス
- 6. 乱数=同じ星の数
- 7. 毎回同じ乱数が生成される
- 8. Vb.net同じ番号を何度も生成する乱数ジェネレータ
- 9. 同じ番号を返すC++ STL乱数生成
- 10. スレッドは同じ乱数を生成しますか?
- 11. Java 7:同じ乱数を生成するThreadLocalRandom
- 12. Node.jsチャットボットは同じ乱数を生成していますか?
- 13. 乱数の生成
- 14. Goで同時に乱数を生成
- 15. 同じ「ランダム」シーケンスを生成する2つの異なるシード
- 16. 乱数生成
- 17. C乱数発生器で時々同じ番号が生成される
- 18. すべてのマシンは、同じシードを使用して同じ乱数の結果を生成しますか?
- 19. 以降のページで同じ番号で使用する乱数を生成
- 20. MATLAB:同じランダム番号シーケンスを生成する
- 21. Spartan-3Eの乱数生成
- 22. 幾何乱数の生成
- 23. Excelでの乱数生成
- 24. スパーク - 乱数生成
- 25. 乱数生成器
- 26. Javascript - 乱数生成
- 27. ATMega乱数生成
- 28. 乱数生成器 - 毎回乱数を生成しない
- 29. 同じSystem.Randomアルゴリズムを使用した線形擬似乱数生成
- 30. 乱数ジェネレータは、再コンパイルするまで同じ番号を生成します
スレッドの場合は、各スレッドに独自のランダム(固定シードあり)または1つのランダム(固定シードあり)からそれぞれの事前に作成されたリストを少数だけ使用することができます。しかし、スレッドがお互いにやりとりする場合、このアプローチはもう働きません。 – Stefan