<div dir="ltr">On Fri, Mar 13, 2015 at 5:59 PM, Neal Becker <<a href="mailto:ndbecker2@gmail.com">ndbecker2@gmail.com</a>> wrote:<br>><br>> Robert Kern wrote:<br>><br>> > On Fri, Mar 13, 2015 at 5:34 PM, Neal Becker <<a href="mailto:ndbecker2@gmail.com">ndbecker2@gmail.com</a>> wrote:<br>> >><br>> >> It is common that to guarantee good statistical independence between<br>> > various<br>> >> random generators, a singleton instance of an RNG is shared between them.<br>> >><br>> >> So I typically have various random generator objects, which (sometimes<br>> >> several levels objects deep) embed an instance of RandomState.<br>> >><br>> >> Now I have a requirement to copy a generator object (without knowing<br>> > exactly<br>> >> what that generator object is).<br>> ><br>> > Or rather, you want the generator object to *avoid* copies by returning<br>> > itself when a copy is requested of it.<br>> ><br>> >> My solution is to use deepcopy on the top-level object.  But I need to<br>> >> overload __deepcopy__ on the singleton RandomState object.<br>> >><br>> >> Unfortunately, RandomState doesn't allow customization of __deepcopy__<br>> >> (or<br>> >> anything else).  And it has no __dict__.<br>> ><br>> > You can always subclass RandomState to override its __deepcopy__.<br>> ><br>> > --<br>> > Robert Kern<br>><br>> Yes, I think I prefer this:<br>><br>> from numpy.random import RandomState<br>><br>> class shared_random_state (RandomState):<br>>     def __init__ (self, rs):<br>>         RandomState.__init__(self, rs)<br>><br>>     def __deepcopy__ (self, memo):<br>>         return self<br>><br>> Although, that means I have to use it like this:<br>><br>> rs = shared_random_state (0)<br>><br>> where I really would prefer (for aesthetic reasons):<br>><br>> rs = shared_random_state (RandomState(0))<br>><br>> but I don't know how to do that if shared_random_state inherits from<br>> RandomState.<br><br><shrug> If you insist:<div><br></div><div>class shared_random_state(RandomState):</div><div>    def __init__(self, rs):</div><div>        self.__setstate__(rs.__getstate__())<br><div><br></div><div>    def __deepcopy__(self, memo):</div><div>        return self<br><br>--<br>Robert Kern</div></div></div>