Hi Peter,

> On Dec 21, 2018, at 8:15 AM, Peter Levart <[email protected]> wrote:
> 
> This is really highly unlikely (1 in 2^800). In fact, it was not possible for 
> this particular test to produce zero BigInteger. That's because the test uses 
> a pseudo-random generator with deterministic algorithm and it uses a constant 
> seed to initialize it before generating the next 2000 BigInteger random 
> numbers with magnitude 0 ... 2^800 - 1:
> 
>   33         Random rnd = new Random(1234);
>   34
>   35         for (int i=0; i<2000; i++) {
>   36             BigInteger m = new BigInteger(800, rnd);
> 
> So if this test didn't fail with zero BigInteger when it is was run for the 
> 1st time, then it can't fail in any other run, because the random numbers 
> produced are the same in any run.

You might be correct for numBits == 800, but if one changes 800 to 8 it fails 
the first time.

> But for the sake of correctness, let's pretend that the numbers are really 
> random. Why pretend? Why not make them really random? By using SecureRandom 
> instead with really random seed?
> 
> Is it important for such test to be deterministic? Perhaps, so it can be 
> re-executed with repeatable results in case it fails.
> 
> So the middle ground would be to make the test undeterministic, but 
> repeatable. By calculating a really random seed (using SecureRandom) and use 
> that seed in a known deterministic pseudo-random generator (java.util.Random) 
> while printing the used seed to the output log before executing the the test 
> logic. In case the test fails, it can be repeated by providing the seed from 
> the log of the failed execution...
> 
> Just thinking loud. Not suggesting you really do anything like that to this 
> test…

Probably you are correct however about the randomness. It should be changed to 
use RandomFactory.

Thanks,

Brian

Reply via email to