Page 3 of 3

Re: NXC random numbers / random seed

Posted: 02 Feb 2011, 00:30
by muntoo
m-goldberg wrote:Yes, you will always get a different sequence of pseudo-random numbers from NXC since srand is continuously being called with the current system time. There is, I suppose, a vanishing small probability the you could get the same sequence by reseting the system clock (by turning the NXT off and then on again) but you certainly couldn't depend on it :-)
What if you named the program "! Startup.rxe"? (Or whatever it was.)

Re: NXC random numbers / random seed

Posted: 02 Feb 2011, 07:52
by HaWe
that won't help in any way, muntoo.

Re: NXC random numbers / random seed

Posted: 02 Feb 2011, 08:08
by mattallen37
Actually, I believe that Muntoo means, that if your program starts running at exactly the same tick count every time (as if your program started automatically when the NXT was turned on, because the program was named "! Startup"), and if you base the seed only on the tick, you will always get the same results (assuming no timing change based on external differences). If needed, I would suggest adding other features as part of the seed. Perhaps battery level, ADCs... However, I do not see how that would ever, in reality, be an issue. I personally, very seldom name my program so it starts automatically, and I rarely use random numbers, not to mention that I have never used a random number generator that wasn't officially implemented (with seed based on who-knows-what).

Re: NXC random numbers / random seed

Posted: 02 Feb 2011, 09:01
by HaWe
the idea with !startup I still don't understand, but however - my random seed currently is based on CurrentTick()*Batterylevel().
I actually doubt that both startuptime and battery level will appear identically one after another.
If you start my demo program several times you'll observe that the seed will never be the same.
If it will appear nevertheless that a seed comes twice or even more often, it will be possible to combine it with any a current sensor reading (US, Light, Sound,...)
But much more important for test and evaluation purposes is the following:
1) now you may have constant seeds for identical pseudo random sequences (if you need to have it)
2) it still has to be proved that all drawn numbers of the generated random sequence are strictly stochastically independend (no cluster, no repetitive loops, all subsequences must be uniformly distributed in large samples): this is the most difficult condition, and I'm not quite sure about that (neither concerning the Lego rand algorithm nor concerning Andy's modulo series - in this respect the Mersenne-Twister algorithm seems to be the most promising way).

Re: NXC random numbers / random seed

Posted: 02 Feb 2011, 22:42
by muntoo
doc-helmut wrote:the idea with !startup I still don't understand, but however - my random seed currently is based on CurrentTick()*Batterylevel().
I think the FW srand() is probably using CurrentTick(), but I don't know exactly. I was just replying to what Morton said.
Haha, look I changed your name :lol: :D :) wrote: I actually doubt that both startuptime and battery level will appear identically one after another.
Plausible. But I think at least 1 out of 100 will be the same as another seed. Maybe.

--

Of course, the Mersenne Twister is a great idea (I tried implementing it 2 years ago, but I was too dumb back then). You should consider adding a rand_init() which takes care of all the seeding for beginners.

Code: Select all

unsigned long RAND_SEED = 1;  // OR: CurrentTick() * BatteryLevel();


unsigned long mixTheBits(unsigned long in)
{
    unsigned long out = 0x00000000;
    for(byte bit = 0; bit < 0x20; bit++)
    {
        out |= (in >> (bit ^ 13)) << bit; // unlucky!
    }
    return(out);
}


unsigned long s_gen()
{
    return(CurrentTick() * BatteryLevel());

    // getting carried away...

    return(mixTheBits(CurrentTick() * BatteryLevel()));
}

void rand_init()
{
    srand(s_gen());
}

Re: NXC random numbers / random seed

Posted: 03 Feb 2011, 02:18
by mattallen37
muntoo wrote:
doc-helmut wrote:...my random seed currently is based on CurrentTick()*Batterylevel().
I think the FW srand() is probably using CurrentTick(), but I don't know exactly. I was just replying to what Morton said.
Haha, look I changed your name :lol: :D :) wrote: I actually doubt that both startuptime and battery level will appear identically one after another.
Plausible. But I think at least 1 out of 100 will be the same as another seed. Maybe...
A lot less than 1 out of 100. I am not sure how many bit the tick counter is, but it is probably at least 16 or 32 bits. That means that there are something like 65,000 (for 16 bit) tick count possibilities. If you multiply that by the operating voltage range, in mili-volts (about 3,600 - 10,000, so about 6,300), you get quite the number of possibilities. If you were to pass the multiplication of the two into a 16 bit int however, you still only have 16 bits to contain the number, so still only about 65,000 possibilities. That is much less than a 1% chance you will get the same seed. If for instance, you were to pass the seed number into an 8 bit variable (byte), there would be a one in 256 chance of a repeat out of two seeds.

Re: NXC random numbers / random seed

Posted: 03 Feb 2011, 08:07
by HaWe

Code: Select all

out |= (in >> (bit ^ 13)) << bit; // unlucky!
what do yo mean with "unlucky" ?