Странное поведение rand() в MATLAB

rand(), похоже, не генерирует действительно случайные числа. У меня есть простая программа, которая возвращает 6-значный номер, вызывая:

for i=1:6
 r=rand(1,1)
end 

поэтому я запускал это 4-5 раз вчера. И сохранил вывод. Сегодня я снова открыл MATLAB и снова вызвал ту же функцию 4-5 раз. Те же цифры были возвращены.

Почему это происходит?

Должен ли я предоставить случайное начальное число или любое другое исправление?

Спасибо за любую помощь!


person jeff    schedule 14.02.2015    source источник
comment
Даже если ответы действительно хороши, я все еще задаюсь вопросом об одном. Когда я запускаю Matlab, числа, сгенерированные rand, всегда разные. Почему-то кажется, что здесь есть что-то, чего мы не знаем. Может быть, семя уже установлено? Во всяком случае, ответы объясняют большинство, и это должно решить ваши проблемы.   -  person patrik    schedule 14.02.2015
comment
В моем случае я запускал rand несколько раз, затем закрывал MATLAB, а также компьютер, и снова все открывал. Возможно, это то, что вам нужно сделать, чтобы сбросить генератор псевдослучайных чисел, чтобы воспроизвести это поведение.   -  person jeff    schedule 14.02.2015


Ответы (2)


Из документации Mathworks, вы можете использовать

rng('shuffle');

перед вызовом rand для установки "случайного" начального числа (на основе текущего времени). Установка начального числа вручную (либо без изменения начального значения при запуске, путем сброса с помощью rng('default'), либо путем установки начального числа вручную с помощью rng(number)) позволяет точно повторить предыдущее поведение.

person alexforrence    schedule 14.02.2015
comment
Спасибо! Я тоже хочу знать, почему это произошло. Есть идеи? редактировать: я в замешательстве. Почему тогда они не помещают rng('shuffle') внутрь rand()? Потому что похоже, что rand() не настолько случайный, насколько это возможно. :D - person jeff; 14.02.2015
comment
Генератор случайных чисел MATLAB возвращается в то же состояние при запуске (которое вы также можете получить из rng('default'), если хотите воспроизвести поведение). - person alexforrence; 14.02.2015
comment
Я бы хотел, чтобы это было случайно, и мы могли бы сохранить его в массиве, если бы захотели. Потому что таким образом числа на самом деле исходят из заранее определенного набора. Так что я все еще не понимаю: D Но ваш ответ решает мою проблему, поэтому я приму его через несколько минут. - person jeff; 14.02.2015
comment
Я предполагаю, что использование rng('shuffle') дает довольно надежное случайное поведение. Истинная случайность довольно сложна. - person alexforrence; 14.02.2015
comment
@halilpazarlama: Весь смысл псевдослучайных чисел в том, что они повторяемы. Это важно для научных целей, когда требуется поток переменных с заданным статистическим распределением, который при необходимости можно восстановить позже. Вы всегда должны явно задавать начальное значение в своем коде через rng, если только вы не пишете какую-то процедуру шифрования или, может быть, игру (а также форте Matab и генератор по умолчанию не является криптографически безопасным) . - person horchler; 14.02.2015
comment
@horchler, так это, почему они называются псевдослучайными? Хорошо, тогда заполнение его таймером или этим, надеюсь, заслуживающим доверия rng('shuffle') кажется мне достаточно случайным :), пожалуйста, дайте мне знать, если есть способ получить еще более случайное: D - person jeff; 14.02.2015
comment
@halilpazarlama - Еще одна причина, по которой вы хотите, чтобы псевдослучайные числа были воспроизводимыми, - это воспроизводимость в научных публикациях. Это необходимо для того, чтобы другие рецензенты могли проверить ваши выводы и, возможно, расширить вашу работу, если вы имеете дело со случайностью. Непредоставление вашего набора данных и приписывание его случайности заставит обозревателей и исследователей поверить вам на слово, что опасно. Вы можете предоставить набор данных, но если вы работаете с большими наборами данных, это будет невозможно. Поэтому более подходящим является предоставление случайного начального числа и среды. - person rayryeng; 17.02.2015

Чтобы расширить ответ @alexforrence, rand и другие связанные функции производят псевдослучайные числа (PRN), которым требуется начальное значение для начала производства. Эти числа не являются по-настоящему случайными, поскольку после начального начального числа числа создаются с помощью алгоритма, который является детерминированным по самой своей природе.

Однако быть псевдослучайным не обязательно плохо, поскольку модели, использующие PRN (например, методы Монте-Карло), могут генерировать переносимые, повторяемые результаты для многих пользователей и платформ. Кроме того, начальное число можно изменить для создания наборов случайных чисел и результатов, которые являются статистически независимыми, но при этом дают повторяемые результаты. Для многих научных приложений это очень важно. Кроме того, «истинные» случайные числа (следующий абзац) имеют тенденцию «слипаться» и неравномерно распределяться по своему диапазону для небольшой выборки пространства, что снижает производительность некоторых методов, основанных на стохастических процессах.

Существуют методы создания «настоящих» случайных чисел путем введения случайности из различных аналоговых источников (например, аппаратного шума). Эти типы чисел чрезвычайно важны для криптографически безопасных PRN, где неповторяемость является важной характеристикой ( в отличие от научного использования). Настоящие генераторы случайных чисел требуют специального оборудования, которое использует естественный шум (например, квантовые эффекты). Однако важно помнить, что общее количество случайных чисел, которые могут быть сгенерированы и использованы в вычислениях, ограничено точностью используемых чисел.

Вы можете повторно заполнить MATLAB псевдослучайным начальным числом, используя rng функция. Однако «слишком частое повторное заполнение генератора в течение сеанса — плохая идея, поскольку это может отрицательно сказаться на статистических свойствах ваших случайных чисел» [src].

person TroyHaskin    schedule 14.02.2015
comment
Хороший. +1. Кстати, я написал этот ответ и дал вам небольшую подсказку :) один-в-векторе-в-matlab/28553156#28553156" title="добавление дополнительных единиц, которые окружают другие значения единицы в векторе в matlab"> stackoverflow.com/questions/28544662/ - person rayryeng; 17.02.2015