Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.random中生成伪随机数时使用的常量值是什么?_Java_Random - Fatal编程技术网

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));
}