On Sat, Mar 07, 2015 at 09:06:13PM +0100, Floris van Manen wrote:

> I'm using the jumpahead() to have multiple streams in parallel, 
> derived from a single point.

I'm afraid I don't understand what that sentence means. Do you mean 
derived from a single seed?

If so, I think the easiest way is to just create multiple random 
instances. Suppose you want five streams of random numbers: create one 
extra "seeder" (or just use the pre-defined top-level random functions):

import random
seeder = random.Random(myseed)  # or just use random.seed(myseed)
streams = [random.Random(seeder.random()) for _ in range(5)]

If you want to reset them to the initial state, just 
reseed the seeder stream and recreate them. Or you can just grab all 
their internal states:

states = [s.getstate() for s in streams]


> def jumpRandomState(self):
>     self.random.setstate(self.randomState)
>     self.random.jumpahead(1)
>     self.randomState = self.random.getstate()

I'm afraid I don't understand the purpose of that method or why you are 
restoring the internal state before jumping. I tried putting it in a 
subclass of random.Random, but it raises an exception:


py> class MyRandom(random.Random):
...     def jumpRandomState(self):
...             self.random.setstate(self.randomState)
...             self.random.jumpahead(1)
...             self.randomState = self.random.getstate()
...
py> rnd = MyRandom(1000)
py> rnd.jumpRandomState()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in jumpRandomState
AttributeError: 'builtin_function_or_method' object has no attribute 
'setstate'

so your code doesn't work for me.

Based just on the name, I would do this:

class MyRandom(random.Random):
    def jumpRandomState(self):
        self.jumpahead(356789)


If you don't trust jumpahead to reliably jump to an independent part 
of the PRNG sequence, re-seed with an independent pseudo-random number:

class MyRandom(random.Random):
    _JUMPER = random.Random()
    def jumpRandomState(self):
        self.seed(self._JUMPER.random())


-- 
Steve
_______________________________________________
pypy-dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-dev

Reply via email to