Как настроить пользовательское семя для генератора псевдослучайных чисел
Мне нужно выполнить несколько тестов, в которых я использую генератор псевдослучайных чисел randn
. Как я могу установить семя самостоятельно, поэтому каждый раз, когда я запускаю этот тест, я получаю те же результаты? (да, я знаю это немного странно, но эта проблема).
Я нашел объект RANDSTREAM
, который имеет свойство seed
, но только для чтения. Есть ли способ использовать его для посева генератора?
Ответы
Ответ 1
Старый способ сделать это:
randn('seed',0)
Новый способ:
s = RandStream('mcg16807','Seed',0)
RandStream.setDefaultStream(s)
Обратите внимание, что если вы используете новый способ, rand
и randn
используют один и тот же поток, поэтому, если вы вызываете оба, вы можете найти разные числа, которые генерируются по сравнению со старым методом (который имеет отдельные генераторы). По этой причине по-прежнему поддерживается старый метод (и устаревший код).
Подробнее см. http://www.mathworks.com/help/techdoc/math/bsn94u0-1.html.
Ответ 2
Вы можете просто вызвать rng(mySeed)
, чтобы установить семя для глобального потока (проверено в Matlab R2011b). Это влияет на функции rand
, randn
и randi
.
та же самая страница, которую Джеймс связал с, перечисляет это как рекомендуемую альтернативу различным старым методам (см. среднюю ячейку правого столбца таблицы).
Вот пример кода:
format long; % Display numbers with full precision
format compact; % Get rid of blank lines between output
mySeed = 10;
rng(mySeed); % Set the seed
disp(rand([1,3]));
disp(randi(10,[1,10]));
disp(randn([1,3]));
disp(' ');
rng(mySeed); % Set the seed again to duplicate the results
disp(rand([1,3]));
disp(randi(10,[1,10]));
disp(randn([1,3]));
Его вывод:
0.771320643266746 0.020751949359402 0.633648234926275
8 5 3 2 8 2 1 7 10 1
0.060379730526407 0.622213879877005 0.109700311365407
0.771320643266746 0.020751949359402 0.633648234926275
8 5 3 2 8 2 1 7 10 1
0.060379730526407 0.622213879877005 0.109700311365407
Ответ 3
mySeed=57; % an integer number
rng(mySeed,'twister') %You can replace 'twister' with other generators
Ответ 4
Когда вы просто хотите reset включить RNG в известное состояние, просто используйте:
seed = 0;
randn('state', seed);
rand ('state', seed);
A = round(10*(rand(1,5))); // always will be [10 2 6 5 9]