java随机数种子_使用种子的Java随机数
使用種子的Java隨機(jī)數(shù)
這是我的代碼,使用種子作為參數(shù)來(lái)生成隨機(jī)數(shù):
double randomGenerator(long seed) {
Random generator = new Random(seed);
double num = generator.nextDouble() * (0.5);
return num;
}
每次我提供種子并嘗試生成100個(gè)數(shù)字時(shí),它們都是相同的。
我怎樣才能解決這個(gè)問(wèn)題?
7個(gè)解決方案
73 votes
如果您給相同的種子,那是正常的。 這是允許測(cè)試的重要功能。
選中此選項(xiàng)可了解偽隨機(jī)生成和種子:
偽隨機(jī)數(shù)發(fā)生器
偽隨機(jī)數(shù)生成器(PRNG),也稱為確定性 隨機(jī)位發(fā)生器DRBG,是一種用于產(chǎn)生序列的算法 近似于隨機(jī)數(shù)屬性的數(shù)。 的 序列不是真正隨機(jī)的,因?yàn)樗耆?相對(duì)較小的一組初始值,稱為PRNG的狀態(tài), 其中包括真正的隨機(jī)種子。
如果要具有不同的序列(通常在不調(diào)整或調(diào)試算法時(shí)使用),則應(yīng)調(diào)用零參數(shù)構(gòu)造函數(shù),該構(gòu)造函數(shù)使用nanoTime嘗試每次獲取不同的種子。 當(dāng)然,此Random實(shí)例應(yīng)保留在您的方法之外。
您的代碼可能應(yīng)該是這樣的:
private Random generator = new Random();
double randomGenerator() {
return generator.nextDouble()*0.5;
}
Denys Séguret answered 2020-07-12T12:24:02Z
21 votes
簡(jiǎn)單的方法是使用:
Random rand = new Random(System.currentTimeMillis());
這是生成Random數(shù)字的最佳方法。
Pollar answered 2020-07-12T12:24:27Z
11 votes
您不應(yīng)該在方法范圍內(nèi)創(chuàng)建新的Random。 使其成為班級(jí)成員:
public class Foo {
private Random random
public Foo() {
this(System.currentTimeMillis());
}
public Foo(long seed) {
this.random = new Random(seed);
}
public synchronized double getNext() {
return generator.nextDouble();
}
}
這僅僅是一個(gè)例子。 我認(rèn)為這樣包裝Random不會(huì)增加任何價(jià)值。 將其放在正在使用的類中。
duffymo answered 2020-07-12T12:24:51Z
6 votes
這就是偽RNG的原理。 這些數(shù)字并不是真正隨機(jī)的。 它們是使用確定性算法生成的,但是根據(jù)種子的不同,生成數(shù)字的順序也會(huì)有所不同。 由于您始終使用相同的種子,因此始終獲得相同的序列。
JB Nizet answered 2020-07-12T12:25:11Z
2 votes
問(wèn)題在于您再次為隨機(jī)生成器添加了種子。 每次播種時(shí),都會(huì)重置隨機(jī)數(shù)生成器的初始狀態(tài),并且生成的第一個(gè)隨機(jī)數(shù)將是初始狀態(tài)之后的第一個(gè)隨機(jī)數(shù)
Minion91 answered 2020-07-12T12:25:31Z
2 votes
如果要使用一個(gè)種子生成多個(gè)數(shù)字,可以執(zhí)行以下操作:
public double[] GenerateNumbers(long seed, int amount) {
double[] randomList = new double[amount];
for (int i=0;i
Random generator = new Random(seed);
randomList[i] = Math.abs((double) (generator.nextLong() % 0.001) * 10000);
seed--;
}
return randomList;
}
如果使用相同的種子,它將顯示相同的列表。
user5479540 answered 2020-07-12T12:25:56Z
1 votes
這里的幾個(gè)示例創(chuàng)建了一個(gè)新的ThreadLocalRandom實(shí)例,但這不是必需的。 也沒有理由像一種解決方案一樣使用synchronized。 相反,請(qǐng)利用ThreadLocalRandom類上的方法:
double randomGenerator() {
return ThreadLocalRandom.current().nextDouble(0.5);
}
Finn answered 2020-07-12T12:26:18Z
總結(jié)
以上是生活随笔為你收集整理的java随机数种子_使用种子的Java随机数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 背包DP入门笔记(1) 骨头收集 HDU
- 下一篇: Java通过坐标点进行拟合函数