How to determine how many random numbers were generated, using Mersenne twister?

6 views (last 30 days)
I want to use Mersenne Twister to generate 2 sets of random numbers using common seed, and want to determine which of these sets used more random numbers. Random number generation is performed by a called function; so calling function doesn't directly know how many random numbers were generated in each call.
rng_state_initial = rng;
% Generate 1st sequence
[output1] = joeblow1(...);
% save the state of rng after 1st sequence generated
rng_state_after_1st_sequence = rng;
% Generate 2nd sequence
[output2] = joeblow2(...);
% save the state of rng after 2nd sequence generated
rng_state_after_2nd_sequence = rng;
If I want to then generate additonl lrandom numbers indepedent of 1st and 2nd sequences, should I use
before generating the new random numbers?
I don't know which random number state (1st or 2nd sequence) is further along.
I can do a hack job to do either rng(rng_state_after_1st_sequence) or rng(rng_state_after_2nd_sequence) and then generate a ginormous number of random numbers that I'm sure exceeds the number of random numbers generated in 1st or 2nd sequence,, save the state after that, and then generate the new random numbers. But I don't want to do that.
Note that multiple streams are not available with Mersenne Twister.
Mark Stone
Mark Stone on 26 Nov 2022
Edited: Mark Stone on 27 Nov 2022
Yes, my hack job accounts for stuff like this. That will work on my existing function. It could break down on some other user's new function, which might be way out in left field vs. what I anticipated; hence why the hack job is unsatisfying for use by someone other than me. If I don't get a "nice" answer, I'll implement a hack job for now, while I consider a bettter long term solution.

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 26 Nov 2022
Record the two rng states. Loop generating one number at a time from each of the two streams until the newly generated state of one of them equals the recorded state of the other.
There is no iteration count information recorded in the state.
If I recall correctly, about two years ago I saw an abstract for a paper about recovering rng state. If you generate N random numbers, can you deduce what the rng state must have been? The number required was much smaller than you might expect. I do not recall the details now, but my brain is saying "Wasn't it only in the range of 8 to 13 needed?" I did not read the paper to see what techniques they were using, but I wonder if some of what they did might be useful for figuring out the meaning of the state differences?
  1 Comment
Mark Stone
Mark Stone on 27 Nov 2022
Thanks. Unfortunately, this seems like it will be painful in run time. But I'll give it a go.

Sign in to comment.

More Answers (1)

Jan on 26 Nov 2022
Edited: Jan on 26 Nov 2022
The direct solution is to modify the function joeblow1 and joeblow1 such, that they count the created random numbers.
Another option is to use a wrapper function, which calls the random number generation and counts the number of created values.
Using the state of the random number generator to count the produced values is rather indirect and cannot be efficient. I cannot imagine a purpose to create additional random numbers only to set the rng to a defined state. Using a new state would be much cheaper. Therefore I assume, that this is an XY-problem. Please explain, which problem you want to solve actually.
"Note that multiple streams are not available with Mersenne Twister." - is this really the case?
Jan on 27 Nov 2022
You can simply include myRand() in the code you distribute. This is even backward compatible to the Matlab versions before rng was introduced.

Sign in to comment.


Find more on Random Number Generation in Help Center and File Exchange




Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!