What if you named the program "! Startup.rxe"? (Or whatever it was.)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
NXC random numbers / random seed
Re: NXC random numbers / random seed
Commit to LEGO Mindstorms Robotics Stack Exchange:
bit.ly/MindstormsSE
Commit to LEGO Stack Exchange: bit.ly/Area51LEGOcommit
Re: NXC random numbers / random seed
that won't help in any way, muntoo.
-
- Posts: 1818
- Joined: 02 Oct 2010, 02:19
- Location: Michigan USA
- Contact:
Re: NXC random numbers / random seed
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).
Matt
http://mattallen37.wordpress.com/
I'm all for gun control... that's why I use both hands when shooting
http://mattallen37.wordpress.com/
I'm all for gun control... that's why I use both hands when shooting
Re: NXC random numbers / random seed
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).
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
I think the FW srand() is probably using CurrentTick(), but I don't know exactly. I was just replying to what Morton said.doc-helmut wrote:the idea with !startup I still don't understand, but however - my random seed currently is based on CurrentTick()*Batterylevel().
Plausible. But I think at least 1 out of 100 will be the same as another seed. Maybe.Haha, look I changed your name :lol: :D :) wrote: I actually doubt that both startuptime and battery level will appear identically one after another.
--
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());
}
Commit to LEGO Mindstorms Robotics Stack Exchange:
bit.ly/MindstormsSE
Commit to LEGO Stack Exchange: bit.ly/Area51LEGOcommit
-
- Posts: 1818
- Joined: 02 Oct 2010, 02:19
- Location: Michigan USA
- Contact:
Re: NXC random numbers / random seed
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.muntoo wrote:I think the FW srand() is probably using CurrentTick(), but I don't know exactly. I was just replying to what Morton said.doc-helmut wrote:...my random seed currently is based on CurrentTick()*Batterylevel().
Plausible. But I think at least 1 out of 100 will be the same as another seed. Maybe...Haha, look I changed your name :lol: :D :) wrote: I actually doubt that both startuptime and battery level will appear identically one after another.
Matt
http://mattallen37.wordpress.com/
I'm all for gun control... that's why I use both hands when shooting
http://mattallen37.wordpress.com/
I'm all for gun control... that's why I use both hands when shooting
Re: NXC random numbers / random seed
Code: Select all
out |= (in >> (bit ^ 13)) << bit; // unlucky!
Who is online
Users browsing this forum: No registered users and 7 guests