Как установить пользовательское начальное число для генератора псевдослучайных чисел - PullRequest
23 голосов
/ 13 января 2011

Мне нужно выполнить несколько тестов, где я использую randn генератор псевдослучайных чисел.Как я могу установить начальное значение самостоятельно, чтобы при каждом запуске этого теста я получал одинаковые результаты?(да, я знаю, что это немного странно, но это проблема).

Я нашел объект RANDSTREAM, который имеет свойство seed, но он доступен только для чтения.Есть ли способ использовать его для посева генератора?

Ответы [ 4 ]

24 голосов
/ 13 января 2011

Старый способ сделать это:

randn('seed',0)

Новый способ:

s = RandStream('mcg16807','Seed',0)
RandStream.setDefaultStream(s)

Обратите внимание, что если вы используете новый способ, rand и randn делятсятот же поток, поэтому, если вы вызываете оба, вы можете найти разные числа, генерируемые по сравнению со старым методом (который имеет отдельные генераторы).По этой причине все еще поддерживается старый метод (и устаревший код).

См. http://www.mathworks.com/help/techdoc/math/bsn94u0-1.html для получения дополнительной информации.

9 голосов
/ 22 июня 2012

Вы можете просто позвонить 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
2 голосов
/ 04 февраля 2013
mySeed=57; % an integer number
rng(mySeed,'twister') %You can replace 'twister' with other generators
0 голосов
/ 10 мая 2014

Если вы просто хотите сбросить ГСЧ в известное состояние, просто используйте:

 seed = 0;
 randn('state', seed);
 rand ('state', seed);
 A = round(10*(rand(1,5))); // always will be [10 2 6 5 9]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...