[ https://issues.apache.org/jira/browse/MATH-1300?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15065416#comment-15065416 ]
Gilles commented on MATH-1300: ------------------------------ Thanks for pointing out that problem. bq. Sequential calls to \[...\] nextBytes must generate the same sequence of bytes, no matter by chunks of which size it was divided. Attempting to figure out how general the claim is, I've implemented a more general unit test based on your suggestion: {code} private void checkNexBytesChunks(int chunkSize, int numChunks) { final RandomGenerator rg = makeGenerator(); final long seed = 1234567L; final byte[] b1 = new byte[chunkSize * numChunks]; final byte[] b2 = new byte[chunkSize]; // Generate the chunks in a single call. rg.setSeed(seed); rg.nextBytes(b1); // Reset. rg.setSeed(seed); // Generate the chunks in consecutive calls. for (int i = 0; i < numChunks; i++) { rg.nextBytes(b2); } // Store last 128 bytes chunk of b1 into b3. final byte[] b3 = new byte[chunkSize]; System.arraycopy(b1, b1.length - b3.length, b3, 0, b3.length); // Sequence of calls must be the same. Assert.assertArrayEquals("chunkSize=" + chunkSize + " numChunks=" + numChunks, b2, b3); } {code} The original CM code always fails it, as you observed. In your example test case (chunkSize=128 and numChunks=8), your fix makes the test pass. However, it fails whenever the size of the array (argument to "nextBytes") is not a multiple of 4. That is, the "chunkSize" does matter. And "nextBytes" in the JDK's {{Random}} class also fails the test when the array's size is not a multiple of 4. So there are several issues: # Do you have a reference that the behaviour _must_ be as your described? # Is the requested behaviour supposed to work only when the array's size is a multiple of 4? If so, should we add some note about it in the documentation? # Is there a way to implement "nextBytes" in {{BitsStreamGenerator}} so that the property holds for any size? And if so, should we consider making the change (given that {{Random}} does not work that way)? > BitsStreamGenerator#nextBytes(byte[]) is wrong > ---------------------------------------------- > > Key: MATH-1300 > URL: https://issues.apache.org/jira/browse/MATH-1300 > Project: Commons Math > Issue Type: Bug > Affects Versions: 3.5 > Reporter: Rostislav Krasny > Attachments: MersenneTwister2.java, TestMersenneTwister.java > > > Sequential calls to the BitsStreamGenerator#nextBytes(byte[]) must generate > the same sequence of bytes, no matter by chunks of which size it was divided. > This is also how java.util.Random#nextBytes(byte[]) works. > When nextBytes(byte[]) is called with a bytes array of length multiple of 4 > it makes one unneeded call to next(int) method. This is wrong and produces an > inconsistent behavior of classes like MersenneTwister. > I made a new implementation of the BitsStreamGenerator#nextBytes(byte[]) see > attached code. -- This message was sent by Atlassian JIRA (v6.3.4#6332)