in reply to Re^2: inclusive rand
in thread inclusive rand
you can't go to full precision.
Please learn the basics of floating numbers and stop randomly changing your posts.
Cheers Rolf
(addicted to the Perl Programming Language and ☆☆☆☆ :)
Je suis Charlie!
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^4: inclusive rand
by msh210 (Monk) on Mar 13, 2017 at 13:05 UTC | |
If I can't go to full precision, then I don't see how the solution you (and another) proposed, subdividing the interval from 0 to a large integer, is the same as inclusive rand. It will always be less precise, i.e. choosing among fewer numbers. No?
$_="msh210";$"=$\;@_=@{[split//,uc]}[2,0];$_="@_$\1";$\=$/;++$_[0]for$...1;print lc substr crypt($_,"@_"),1,6
| [reply] [d/l] [select] |
by LanX (Saint) on Mar 13, 2017 at 13:12 UTC | |
I doubt that the output at full precision is really equally distributed because of involved rounding errors.
Cheers Rolf
| [reply] |
by LanX (Saint) on Mar 13, 2017 at 13:32 UTC | |
This consequently means one decides how big the result set is in order to define the requested probability of one single element of this set (which is actually only approximated) and some other criteria like distribution (also approximated) If ... for any applications which are beyond my experience ... the resolution of the build in rand is not enough, you'd simply use another rand-module from CPAN in conjunction with something like bignum Now ... asking for equally distributed real numbers is nonsensical, because you can't tell the expected probability of say pi. And even if you used a natural random number generator ... like by measuring radio activity ... you'd finally be confronted with the limits of quantum mechanics. There is no unlimited precision. We live in reality, and computers are build into the real world (i.e. this universe) This means a random number is always ultimately some integer in disguise. Sorry your question can't be answered otherwise because it would become unreal.
Cheers Rolf
| [reply] |
by LanX (Saint) on Mar 13, 2017 at 15:19 UTC | |
even if you don't want to use a self defined precission you could try this perl -Mposix -E" say rand(1+1/2**47) for 1..20" So why 47? Just try and error on my system
I'm too lazy to figure out how exactly the limits of the mantissa is used internally and where the caveats are. And taking the rounding errors in these into assumption this shouldn't matter much. (as BUK mentioned under windows before 5.20 rand is limted to 15 bits only.) The practical value of this is too small to justify more elaboration.
updateor alternatively to avoid floats and rounding errors
Cheers Rolf
| [reply] [d/l] [select] |
by pryrt (Abbot) on Mar 13, 2017 at 16:06 UTC | |
The limit of the mantissa is the ULP. For a double-precision float typically used in perl, it's 2**-52 times the main power of two for the number:
This can also be seen in your 1+1/2**x by printing the underlying IEEE754, or by using a powers-of-two representation of the float, or by always using %.16f
for numbers from 0.5 to 0.9999..., it's one better:
| [reply] [d/l] [select] |
by LanX (Saint) on Mar 13, 2017 at 16:15 UTC | |
by msh210 (Monk) on Mar 13, 2017 at 16:01 UTC | |
Interesting ideas. Thanks!
$_="msh210";$"=$\;@_=@{[split//,uc]}[2,0];$_="@_$\1";$\=$/;++$_[0]for$...1;print lc substr crypt($_,"@_"),1,6
| [reply] [d/l] |