NICTA / rng

Pure-functional random value generation

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

The upper bound on doubles doesn't seem to have an effect

beloglazov opened this issue · comments

Hi,

I played with the library a little bit and found that the upper bound on random doubles doesn't seem to be respected:

scala> choosedouble(1, 1).run.unsafePerformIO
res31: Double = 1.0

scala> choosedouble(1, 2).run.unsafePerformIO
res32: Double = 28.386146545410156

scala> choosedouble(1, 2).run.unsafePerformIO
res33: Double = 754.0

scala> choosedouble(1, 2).run.unsafePerformIO
res34: Double = 2.000096254829259

scala> choosedouble(1, 2).run.unsafePerformIO
res35: Double = 104.27803802490234

Am I doing something wrong?

Thanks,
Anton

Thanks for the quick fix! I don't see it in the master and in sonatype, is it going to be pushed there?

Thanks,
Anton

Sorry I messed up with my pull request. I reopened it and I would like @tonymorris to approve it first before I publish anything.

As you can see I also added some tests and a Travis build so if you want to fix things and submit pull requests they will be automatically verified.

I have reviewed commit ed0d892 and I approve.

Here is the jar.

Great, thanks!

I've just done a quick test, the distribution of the generated doubles seems to be skewed towards the lower bound:

scala> choosedouble(1, 2).run.unsafePerformIO
res54: Double = 1.0011095686049147

scala> choosedouble(1, 2).run.unsafePerformIO
res55: Double = 1.0000356445346579

scala> choosedouble(1, 2).run.unsafePerformIO
res56: Double = 1.1285885974535153

scala> choosedouble(1, 2).run.unsafePerformIO
res57: Double = 1.0006685060348026

scala> choosedouble(1, 2).run.unsafePerformIO
res58: Double = 1.0009929253356358

scala> choosedouble(1, 2).run.unsafePerformIO
res59: Double = 1.8522376543209877

scala> choosedouble(1, 2).run.unsafePerformIO
res60: Double = 1.716083916083916

scala> choosedouble(1, 2).run.unsafePerformIO
res61: Double = 1.0397543377346463

scala> choosedouble(1, 2).run.unsafePerformIO
res62: Double = 1.3588929787660255

scala> choosedouble(1, 2).run.unsafePerformIO
res63: Double = 1.000389606912772

scala> choosedouble(1, 2).run.unsafePerformIO
res64: Double = 1.0000037536159925

scala> choosedouble(1, 2).run.unsafePerformIO
res65: Double = 1.0000000000682594

scala> choosedouble(1, 2).run.unsafePerformIO
res66: Double = 1.0029270670072388

scala> choosedouble(1, 2).run.unsafePerformIO
res67: Double = 1.0000000003395206

scala> choosedouble(1, 2).run.unsafePerformIO
res68: Double = 1.0000002526574467

scala> choosedouble(1, 2).run.unsafePerformIO
res69: Double = 1.967248908296943

scala> choosedouble(1, 2).run.unsafePerformIO
res70: Double = 1.0000000059713

scala> choosedouble(1, 2).run.unsafePerformIO
res71: Double = 1.0000004681626657

scala> choosedouble(1, 2).run.unsafePerformIO
res72: Double = 1.0000000000446068

scala> choosedouble(1, 2).run.unsafePerformIO
res73: Double = 1.0000022913746494

scala> choosedouble(1, 2).run.unsafePerformIO
res74: Double = 1.0805235411079328

Isn't it supposed to be a uniform distribution?