Dconf 2015 talks...

Joseph Rushton Wakeling via Digitalmars-d digitalmars-d at puremagic.com
Mon Jan 25 13:20:09 PST 2016


On Monday, 25 January 2016 at 18:40:59 UTC, Jonathan M Davis 
wrote:
> As long as the numbers are pseudo-random, then in theory, 
> there's no problem with a range of random numbers being a 
> forward range.

I thought that too, for a long time, but I came to the conclusion 
it's not the case.

Here's the essence of the problem: a forward range is a promise 
to the code that uses it, "I am a deterministic sequence."  But 
the whole point of pseudo-random sequences is that you're not 
supposed to be able to tell them from actual randomness.

If you _tell_ downstream code "I am deterministic", that code may 
make assumptions about how it can use you, that are valid for 
"normal" deterministic sequences, but aren't valid for what are 
supposedly random sequences.

Consider the typical handling of forward ranges:

     auto foo (R) (R range)
         if (isForwardRange!R)
     {
         auto rcopy = range.save;

         // do something with rcopy
     }

That's fine if you're dealing with something whose behaviour is 
meant to be deterministic, but if you call this with a 
pseudo-random sequence, than every time you call it, you will get 
the same result.  It won't matter if what you pass is a 
reference-type -- the .save (which is correct behaviour for 
handling a forward range) means you're just repeatedly using a 
copy of the random sequence.

> That could be useful upon occasion (similar to how it can be 
> useful that the same seed results in the same sequence of 
> numbers).

Right, but the point is that re-use of a pseudo-random sequence 
should happen at programmer request only, not under the hood in 
library code they call -- which is what unfortunately happens if 
you implement RNGs and other random sequences as forward ranges 
:-(


> The problem is that if they're a forward range, then you tend 
> to get code that accidentally ends up reusing numbers in the 
> sequence and that definitely is a problem. So ultimately, they 
> probably should be input ranges rather than forward ranges, but 
> I think that it's more of an issue with human error than with 
> what makes sense from a technical perspective.

Again, I thought that too, but I came to the conclusion that I'd 
been wrong.  It's not about fallible humans, it's about the 
promise a forward range makes.

Superficially, it looks like that promise is: "You can use my 
deterministic nature if you need to."  But actually, I think it 
is really something stronger: "You can use my deterministic 
nature freely and nothing will go wrong in doing so."

That's a much stronger promise than can be allowed for a 
pseudo-RNG, and I think it's borne out in the way in which e.g. 
phobos functionality makes use of forward ranges.

> Regardless, non-pseudo random number generators obviously can't 
> be forward ranges though, since their state isn't savable or 
> repeatable.

Right -- non-PRNGs must be input ranges by design.  I came to the 
conclusion that pseudo-RNGs need to be input ranges, but that 
implement an alternative to .save: a .dup method whose promise 
is, "You can duplicate the state and hence behaviour of this 
range, but you can't make any assumptions that this is a safe or 
sane thing to do."


More information about the Digitalmars-d mailing list