Причина, по которой значения не лежат в интервале [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;
.