Random.nextBytes(字节[])在java中的行为
问题是,为什么在单独的方法调用中获取相同数量的字节会返回不同的字节,这取决于在单个方法调用中调用的5000字节或5000个方法调用是使用长度为1的字节数组进行的 以下面的示例为例:在终端中打印21,而不是5000(5000除以256得到19,这使得21个匹配很可能是简单的巧合)Random.nextBytes(字节[])在java中的行为,java,random,Java,Random,问题是,为什么在单独的方法调用中获取相同数量的字节会返回不同的字节,这取决于在单个方法调用中调用的5000字节或5000个方法调用是使用长度为1的字节数组进行的 以下面的示例为例:在终端中打印21,而不是5000(5000除以256得到19,这使得21个匹配很可能是简单的巧合) Random rand=new Random(0); 字节tmp1[]=新字节[5000]; 兰特下字节(tmp1); rand=新随机数(0); 字节tmp2[]=新字节[5000]; 字节tmp3[]=新字节[1];
Random rand=new Random(0);
字节tmp1[]=新字节[5000];
兰特下字节(tmp1);
rand=新随机数(0);
字节tmp2[]=新字节[5000];
字节tmp3[]=新字节[1];
对于(int i=0;i<5000;i++)
{
兰特下字节(tmp3);
tmp2[i]=tmp3[0];
}
int匹配=0;
对于(int i=0;i<5000;i++)
{
if(tmp1[i]==tmp2[i])
{
匹配++;
}
}
System.out.println(匹配项);
更重要的是,任何破解方法都会生成相同的字节,这与我是使用长度为5000的数组调用该方法一次还是使用长度为2500的数组调用该方法两次无关,等等
编辑:下面的帖子完美地回答了这个问题,一次接收4字节完全解决了这个问题。
测试代码如下,返回4000:
Random rand1 = new Random(0);
byte tmp11[] = new byte[4000];
rand1.nextBytes(tmp11);
rand1 = new Random(0);
byte tmp22[] = new byte[4000];
byte tmp33[] = new byte[4];
for(int i = 0; i < 1000;i++)
{
rand1.nextBytes(tmp33);
for(int a = 0; a < 4;a++)
{
tmp22[(i*4)+a] = tmp33[a];
}
}
int matches1 = 0;
for(int i = 0; i < 4000;i++)
{
if(tmp11[i] == tmp22[i])
{
matches1++;
}
}
System.out.println(matches1);
Random rand1=新随机数(0);
字节tmp11[]=新字节[4000];
rand1.nextBytes(tmp11);
rand1=新随机数(0);
字节tmp22[]=新字节[4000];
字节tmp33[]=新字节[4];
对于(int i=0;i<1000;i++)
{
rand1.nextBytes(tmp33);
对于(int a=0;a<4;a++)
{
tmp22[(i*4)+a]=tmp33[a];
}
}
int matches1=0;
对于(int i=0;i<4000;i++)
{
if(tmp11[i]==tmp22[i])
{
matches1++;
}
}
系统输出打印LN(匹配1);
这是因为java使用nextInt()填充字节,并将其他3个int值字节添加到数组中。基本上,从随机生成器接收的每个int填充数组的4个字节。我将添加一个示例
以下是javadoc的第一部分:
nextBytes方法是通过Random类实现的,就像通过:
public void nextBytes(byte[] bytes) { for (int i = 0; i <
bytes.length; )
for (int rnd = nextInt(), n = Math.min(bytes.length - i, 4);
n-- > 0; rnd >>= 8)
bytes[i++] = (byte)rnd;
}
印刷品:
96
56
96
56因为int的大小是4。基本上,它得到一个int(即4个字节),并将其添加到0,1,2,3位置的字节数组中。当您使用字节[1]调用它时,它会得到相同的int并将相同的字节添加到值0,但int中的其他3个字节将丢失。这就是为什么你会不一致。您得到的数字21只是巧合。这是因为java使用nextInt()填充字节,并将其他3个int值字节添加到数组中。基本上,从随机生成器接收的每个int填充数组的4个字节。我将添加一个示例 以下是javadoc的第一部分: nextBytes方法是通过Random类实现的,就像通过:
public void nextBytes(byte[] bytes) { for (int i = 0; i <
bytes.length; )
for (int rnd = nextInt(), n = Math.min(bytes.length - i, 4);
n-- > 0; rnd >>= 8)
bytes[i++] = (byte)rnd;
}
印刷品:
96
56
96
56因为int的大小是4。基本上,它得到一个int(即4个字节),并将其添加到0,1,2,3位置的字节数组中。当您使用字节[1]调用它时,它会得到相同的int并将相同的字节添加到值0,但int中的其他3个字节将丢失。这就是为什么你会不一致。您得到的数字21只是巧合。因为java的
Random
是一个伪随机数生成器,每次调用invoke anynext
方法时,它的内部“状态”都将前进,即返回一个可能与前一个不同的伪随机数。结合对以下内容的描述,即它从对nextInt
的一次调用中为目标字节数组中的每4个字节构造目标字节数组,这将导致代码的不同结果。因为java的Random
是一个伪随机数生成器,每次调用invoke anynext
方法时,其内部“状态”都将前进,即返回一个可能与前一个不同的伪随机数。结合对以下内容的描述,即它从对nextInt
的一次调用中为目标字节数组中的每4个字节构造目标字节数组,这将导致代码的不同结果。这是随机种子发生的地方吗?不,如示例中所示,两个随机类实例的种子都为0。种子是相同的这是随机种子发生的地方吗?不,从示例中可以看出,两个随机类实例的种子都是0。种子是相同的,没有转化。他只得到一个int,并从int值中丢失其他3个字节。当他有5000字节数组时,他使用这3个字节。这就是为什么inconsistency@VeselinDavidov从4个字节中删除3个字节在某种程度上是一种转换;)我的意思是,伪随机数生成器在输入相同种子时总是给出相同的整数。因此,他可以相信随机结果每次都是相同的-只是他在转换过程中丢失了一些字节。换句话说,请求1字节,返回第一个nextInt()内部调用的第一个字节,再次请求一个字节,返回第二个内部nextInt()调用的第一个字节,请求两个字节将从第三个内部nextInt调用返回第一个字节和第二个字节Yeah如果它从nextInt()中获得4个字节,则不会再次随机调用,而是使用另一个ByTest优化调用。这不是转换。他只得到一个int,并从int值中丢失其他3个字节。当他有5000字节数组时,他使用这3个字节。这就是为什么inconsistency@VeselinDavidov从4个字节中删除3个字节在某种程度上是一种转换;)我的意思是,伪随机数生成器在输入相同种子时总是给出相同的整数。因此,他可以依靠随机结果得到相同的结果
Random rand = new Random(0);
rand.nextBytes(tmp1);
System.out.println(tmp1[0]);
System.out.println(tmp1[4]);
rand = new Random(0);
rand.nextBytes(tmp3);
System.out.println(tmp3[0]);
rand.nextBytes(tmp3);
System.out.println(tmp3[0]);