rng('default') unreliable

10 次查看(过去 30 天)
broken_arrow
broken_arrow 2022-6-13
I have some lengthy code (too long to post here) which executes some sampling based computations. At the beginning of the code, I set
rng('default')
to ensure reproducibility of results for debugging purposes (afaik, this means a Mersenne twister with seed 0). This is the only place in the code where rng is invoked. During program execution, some quantities are sampled using normrnd, which are subsequently used as inputs for the computations. The thing is, I've noticed on multiple occasions now that running the exact same code several times does NOT always yield the exact same results.
I always have one instance of Matlab running in GUI mode. Alternatively, I can also run the code in batch mode in the background, which I do most of the time. Although I change absolutely nothing in the code, the sample values occasionally (not always) differ from run to run. I can't figure out what's going on, but since my input does not change, it must have something to do with the rng. Has someone experienced the same problem? Could it be some kind of crossfire between GUI and batch mode? Or does rng('default') involve time or some other "random" variable?

回答(2 个)

Jan
Jan 2022-6-13
编辑:Jan 2022-6-13
rng('default') sets the random number generator to the initial state. This is a reliable procedure.
If your code replies different results for the random numbers, it must contain another source of randomness. If this effect occurs only sometimes, it does not seem to be a problem related to the value of the current time. This would be something like:
% Not likely to be the problem:
itime = now;
while now - itime < 5
a = rand;
end
Such dependencies on the time should be observable in all runs.
Another problem can be using different inputs relying ob the path "D:" : This is the last folder used on the disk D and can be influenced by external software. Brrr, such evil.
I assume, you have to check the code and search for the source of the problem. While the RNG is known not to create magical output, you either process different inputs (without knowing it) or there is another source of entropy.
  8 个评论
Steven Lord
Steven Lord 2022-6-15
Or you could sort the output of fieldnames before deciding which field gets which random vector if you don't need or want to reorder the struct array itself.
broken_arrow
broken_arrow 2022-6-17
That is one possibilitiy. It still seems strange that dynamic properties apparently are not created in the specified order (even in GUI mode) and in batch mode the order even appears to be random (c. f. below). Maybe that should be changed (just my opinion).

请先登录,再进行评论。


broken_arrow
broken_arrow 2022-6-15
编辑:broken_arrow 2022-6-15
Ok, it seems we have to go one step further. I think it's actually a problem with dynamicprops objects. Let me give a code example. Take this function file:
function fieldnametest
myobj = dynpropobj;
myobj.afield = "these";
myobj.bfield = "are";
myobj.cfield = "exemplary";
myobj.dfield = "attributes";
myfields = fieldnames(myobj);
disp(myfields)
end
with an additional classdef file:
classdef dynpropobj < dynamicprops
methods
function obj = dynpropobj % constructor
obj.addprop('afield');
obj.addprop('bfield');
obj.addprop('cfield');
obj.addprop('dfield');
end
end
end
If i run fieldnametest in GUI mode, the fields are (as observed so far) always created in the same sequence. But if I create a batch file
cmd /k ^
matlab -batch -wait ""cd('F:\testfolder')"; "fieldnametest""
(where cmd /k ^ is to keep cmd open after execution and 'F:\testfolder' is the directory where the aforementioned files are located) and run it, the field name order seems to get shuffled randomly (at least that is what I observe on my computer).

类别

Help CenterFile Exchange 中查找有关 Environment and Settings 的更多信息

产品


版本

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by