# atRandom & integer agnosticism

5 messages
Open this post in threaded view
|

## atRandom & integer agnosticism

 Hello community.Kindly consider:| n i r |n := ( 2 ** 256 ) - 1 .  "the largest 256-bit value"i := ( 0 to: n ) .  "the interval 0 to 2**256-1""Produce three sets of computed test results."3 timesRepeat: [   Transcript show: ( r := i atRandom ) ; cr .   Transcript show: ( r asByteArray hex ) ; cr . ]According to comments in Pharo library code, atRandom fails for integer magnitudes greater than 2**30 .  A reason for this limitation is not given, and it's not clear to a novice such as myself why the computed result of atRandom is permitted to sometimes be in conflict with the semantics of atRandom .Can anyone provide a basic explanation of the rationale for a 'broken' atRandom ?Alternatively, is this a known bug?Thanks.dr
Open this post in threaded view
|

## Re: atRandom & integer agnosticism

 Try it in Squeak and pick the relevant methods. Open a bug report and commit the fix. Of course, original authorship will somehow be spoiled, so be kind and cite them in commit message.Le lun. 11 févr. 2019 à 07:59, David Richards <[hidden email]> a écrit :Hello community.Kindly consider:| n i r |n := ( 2 ** 256 ) - 1 .  "the largest 256-bit value"i := ( 0 to: n ) .  "the interval 0 to 2**256-1""Produce three sets of computed test results."3 timesRepeat: [   Transcript show: ( r := i atRandom ) ; cr .   Transcript show: ( r asByteArray hex ) ; cr . ]According to comments in Pharo library code, atRandom fails for integer magnitudes greater than 2**30 .  A reason for this limitation is not given, and it's not clear to a novice such as myself why the computed result of atRandom is permitted to sometimes be in conflict with the semantics of atRandom .Can anyone provide a basic explanation of the rationale for a 'broken' atRandom ?Alternatively, is this a known bug?Thanks.dr
Open this post in threaded view
|

## Re: atRandom & integer agnosticism

 In reply to this post by David Richards The "random" index for atRandom is, basically, computed prngOutput mod: selectionRange. For large selection ranges, it fails because the period of the PRNG used by atRandom is 2^30th, with the output an integer in the range 1 - 2^30th. (in other words, the prng is a repeating sequence of every number between 1 and 2^30th) That means: - There will be bias when the range you pick from approaches 2^30th. - There will be gaps (indexes that won't ever be picked) once you pass 2^30th. The reason is techical; the default RNG is a reasonable compromise between speed, memory, and usable range. If the intended use requires a larger range, an appropriate random number generator can be provided using atRandom: It certainly could give an error and/or select another RNG automatically if outside applicable range, but no one has been bothered enough to do either, yet. Cheers, Henry -- Sent from: http://forum.world.st/Pharo-Smalltalk-Developers-f1294837.html