[ 
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)

Reply via email to