java.util.random中生成伪随机数时使用的常量值是什么?
我有点好奇什么是常量(如果它们真的是 常量)用于java.util.random中生成伪随机数时使用的常量值是什么?,java,random,Java,Random,我有点好奇什么是常量(如果它们真的是 常量)用于java.util.Random中 我使用了方法setSeed(),给它一个值3,并将它可以生成的值的限制设置为5或random.nextInt(5) random.setSeed(3); int[]n=新的int[5]; for(int i=0;i
java.util.Random
中
我使用了方法setSeed()
,给它一个值3
,并将它可以生成的值的限制设置为5
或random.nextInt(5)
random.setSeed(3);
int[]n=新的int[5];
for(int i=0;i
生成的数字是4,0,0,1,3
。我知道java.util.Random
使用线性同余数生成器生成随机数
Xn+1=(aXn+c)模块m
现在,我如何追溯或找到线性数同余生成器中使用的值。我知道Xn值是我输入的种子值,在本例中是
3
。如何找到m、a和c的值?参考您发布的公式:
Xn+1=(aXn+c)模块m
相当于将X0设置为3
及
相当于执行m=5的公式
a和C的值可以通过查找java库源代码找到。为此,右键单击Random并选择IDE中的view source。如果查看
java.util.Random
源代码,您将发现:
private static final long multiplier = 0x5DEECE66DL;
private static final long addend = 0xBL;
private static final long mask = (1L << 48) - 1;
呃,通过阅读soruce代码?
nextInt()
与next(int)
不同,很抱歉我错过了这一部分,我只是在您询问时添加了如何查找当前值。注意:a和C可能会从一个版本更改为另一个版本,这是可能的,尽管不常见,但最好是在源代码中查找。好的,a等于0x5deec66dl,C等于0xBL。老实说,我还是一个初学者,我对编程的知识还不多。那么,如果这些值变成int,意味着什么呢?它们是长数字的十六进制表示。末尾的L表示长,其余的可以使用十六进制转换器转换为十进制,如:。所以a=25214903917和c=11@Rick好的,所以我计算了它(25214903917*3+11)mod 5=2
。为什么是2?从我的输出中,我将种子设置为3,生成的第一个数字是4。我的错误是什么?“random.nextInt(5)
相当于用m=5执行公式”:不,您正在考虑next(5)
nextInt()
调用next(31)
,然后调整结果以确保均匀分布。确定a
等于0x5deec66dl
,c
等于0xBL
。老实说,我还是一个初学者,我对编程的知识还不多。那么,如果它变成int,这些值意味着什么呢?
random.setSeed(3);
random.nextInt(5)
private static final long multiplier = 0x5DEECE66DL;
private static final long addend = 0xBL;
private static final long mask = (1L << 48) - 1;
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}