Генерация случайных чисел с помощью randn в MATLAB - PullRequest
0 голосов
/ 20 ноября 2018

Я использую randn в MATLAB для генерации набора случайных чисел для данного среднего значения и стандартного отклонения.

b=5000;
a=500;
y = a.*randn(100,1) + b;
sprintf('%f\n',y)

Я ожидаю, что сгенерированные числа будут лежать между 4500 и 5500. Но ясм. значения в диапазоне от 3000 до 6000.

Может ли кто-нибудь объяснить, почему это происходит?

Или есть ли способ указать, что значения должны лежать между средним плюсом / минус 1 SD?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Или есть какой-либо способ указать, что значения должны лежать между средним плюс / минус 1 SD?

Нет , по определению.

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

В качестве альтернативы вы можете использовать другое распределение, например равномерное (rand), чтобы ограничить случайность разрывом.

0 голосов
/ 20 ноября 2018

Причина, по которой значения не лежат в интервале [4500,5500], заключается в том, что числа, выходящие из randn(), не ограничиваются интервалом [-1,1], поэтому ваш подход не работает так, как вы намеревались, дажехотя общий подход имеет смысл.Числа, идущие от randn, взяты из стандартного нормального распределения, стандартное отклонение которого равно единице, а среднее значение равно нулю.Теоретически, любое значение между -inf и +inf может быть получено из ранда.

Вы можете сделать одно из следующих двух действий, в зависимости от того, что вы хотите сделать после, и как это ограничивает ваши параметры:

Опция 1 состоит в том, чтобы сгенерировать ваши случайные числа и поделить на максимальное абсолютное значение, прежде чем делать что-либо еще, то есть:

z = randn(100,1);
z = z / max(abs(z));
y = 5000 + 500*z;

, это обеспечит z не содержит значений меньше -1 или больше +1 (обратите внимание, что это гарантирует, что хотя бы один из них (-1 или +1) будет присутствовать в массиве z).Затем вы можете использовать значения b и a для перевода значений в случайные числа в выбранном вами интервале.

Редактировать: note (как указано в комментарияхна этот ответ), что, хотя вышеуказанный параметр даст вам случайные значения в выбранном вами интервале, он также изменит распределение и стандартное отклонение, связанное с этими значениями.Если для вас важно, чтобы значения соответствовали нормальному распределению, не используйте эту опцию.

Опция 2 должна использовать rand(), которая всегда возвращает числа из интервала [0,1].Обратите внимание, что они получены из равномерного распределения, а не из нормального распределения.Затем вы можете сначала перевести эти значения в интервал [-1,1]:

z = rand(100,1);
z = 2*z - 1;      % Translates the interval from [0,1] to [-1,1]

, а затем сгенерировать ваши числа, как и раньше;y = 5000 + 500*z;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...