[squeak-dev] The Inbox: Kernel-nice.754.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Mon Apr 22 23:59:10 UTC 2013
And we should better make chunks of 24 bits with current generator !!!
2013/4/23 <commits at source.squeak.org>
> Nicolas Cellier uploaded a new version of Kernel to project The Inbox:
> http://source.squeak.org/inbox/Kernel-nice.754.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-nice.754
> Author: nice
> Time: 23 April 2013, 1:35:44.22 am
> UUID: 6525e6a7-e2f0-4b62-87e1-38915e225671
> Ancestors: Kernel-fbs.753
>
> Quick workaround to generate a large random with a poor generator.
>
> Notably, anything above 53 bits will be biased.
> Moreover, asking 309 decimal digits or more will overflow a double.
>
> THIS DESERVES MORE THOUGHTS:
> The workaround should better be handled in the generator itself...
>
> =============== Diff against Kernel-fbs.753 ===============
>
> Item was added:
> + ----- Method: LargePositiveInteger>>atRandom: (in category 'truncation
> and round off') -----
> + atRandom: aGenerator
> + "Answer a random integer from 1 to self picked from aGenerator."
> +
> + | h chunk n k head res nextBytes |
> + (h := self highBit) <= 48
> + ifTrue: [^super atRandom: aGenerator].
> + chunk := 1 << 48.
> + res := self class new: self digitLength neg: false.
> + n := h - 1 // 48.
> + 1 to: n do: [:i |
> + nextBytes := (aGenerator nextInt: chunk) - 1.
> + 1 to: 6 do: [:j |
> + res digitAt: i - 1 * 6 + j put: (nextBytes
> digitAt: j)]].
> +
> + k := h - (n * 48).
> + chunk := 1 << k.
> + head := self >> (n * 48).
> +
> + [(nextBytes := (aGenerator nextInt: chunk) - 1) > head
> + or:
> + [1 to: nextBytes digitLength do: [:j |
> + res digitAt: n * 6 + j put: (nextBytes
> digitAt: j)]].
> + res >= self] whileTrue.
> +
> + ^res + 1!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20130423/01011886/attachment.htm
More information about the Squeak-dev
mailing list
|