代码之家  ›  专栏  ›  技术社区  ›  Barny

Java中的随机NestBox(字节[])行为

  •  0
  • Barny  · 技术社区  · 6 年前

    问题是,为什么在单独的方法调用中获取相同字节数的行为会根据单个方法调用中调用的5000个字节或使用长度为1的字节数组进行的5000个方法调用返回不同的字节。

    以下面的例子为例:在终端中打印21,而不是5000,(5000除以256得到19,这使得21个匹配可能只是简单的巧合)。

    Random rand = new Random(0);
    byte tmp1[] = new byte[5000];
    rand.nextBytes(tmp1);
    rand = new Random(0);
    byte tmp2[] = new byte[5000];
    byte tmp3[] = new byte[1];
    for(int i = 0; i < 5000;i++)
    {
        rand.nextBytes(tmp3);
        tmp2[i] =tmp3[0];
    }
    int matches = 0;
    for(int i = 0; i < 5000;i++)
    {
        if(tmp1[i] == tmp2[i])
        {
            matches++;
        }
    }
    System.out.println(matches);
    

    更重要的是,任何让它产生相同字节的方法都与我调用长度为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);
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Veselin Davidov    6 年前

    这是因为Java使用NEXTINT()来填充字节,并将其他3个int值字节添加到数组中。基本上,从随机生成器接收的每个int都会填充数组的4个字节。我将添加一个示例。

    下面是JavaDoc First:

    方法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; 
     }
    

    现在,为了展示这个例子,我们可以:

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

    印刷品: 九十六 五十六 九十六 56因为int的大小是4。基本上,它得到一个int(4个字节),并将其添加到位置0、1、2、3的字节数组中。当使用字节[1]调用它时,它会得到相同的int,并将相同的字节添加到值0中,但int中的其他3个字节将丢失。这就是你不一致的原因。你得到的21号只是巧合。

        2
  •  0
  •   Tedil    6 年前

    自从Java以来 Random 是一个伪随机数生成器,每次调用Invoke Any next 方法的内部“状态”将前进,即返回可能与前一个不同的伪随机数。连同对 nextBytes 它从一个调用构造目标字节数组 nextInt 对于目标字节数组中的每4个字节,这将导致代码产生不同的结果。