How to determine how many random numbers were generated, using Mersenne twister?
11 次查看(过去 30 天)
显示 更早的评论
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
rng(rng_state_initial);
[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
rng(rng_state_after_1st_sequence)
or
rng(rng_state_after_2nd_sequence)
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.
2 个评论
Jeff Miller
2022-11-26
Another cluges, if you know an upper limit on the difference between the numbers of rng calls by the two functions. E.g., the one that is farther ahead is at most 1000 calls ahead of the one that is farther behind. If so, it seems like you could generate 1000 numbers from sequence 1 and see whether it catches up to the sequence 2 (i.e., generates the next number produced by sequence 2). You could then proceed using whichever sequence you determine to be farther ahead.
If you know an upper bound like 1000 that isn't too large, it might be a bit faster than the cluge you are thinking of.
采纳的回答
Walter Roberson
2022-11-26
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 个)
Jan
2022-11-26
编辑:Jan
2022-11-26
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?
4 个评论
Jan
2022-11-27
You can simply include myRand() in the code you distribute. This is even backward compatible to the Matlab versions before rng was introduced.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Random Number Generation 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!