Функция rand когда-либо производит значения 0 или 1 в MATLAB/Octave?
Я ищу функцию, которая будет генерировать случайные значения между 0
и 1
включительно. Я сгенерировал 120,000 случайных значений, используя rand()
функция в октаве, но ни разу не получила значения 0
или 1
в качестве выходного. Делает rand()
когда-либо производили такие значения? Если нет, есть ли другая функция, которую я могу использовать для достижения желаемого результата?
5 ответов
если Вы читаете документацию rand
как Октавы и MATLAB, это открыть интервал между символами (0,1)
, поэтому нет, он не должен генерировать числа 0 или 1.
тем не менее, вы можете создать набор случайных чисел, затем нормализуйте значения так, чтобы они лежали между [0,1]
. Поэтому, возможно, используйте что-то вроде randi
(MATLAB docs, Octave docs), где он генерирует целое число от 1 до заданного максимального. При этом определите это максимальное число, затем вычитайте на 1 и разделите на этот максимум смещения, чтобы получить значения между [0,1]
включительно:
max_num = 10000; %// Define maximum number
N = 1000; %// Define size of vector
out = (randi(max_num, N, 1) - 1) / (max_num - 1); %// Output
если вы хотите, чтобы это больше походило на rand
но включая 0 и 1, Сделайте max_num
переменная довольно большая.
rand
производит числа из открыть интервал (0,1)
, который не включает 0 или 1, поэтому вы никогда не должны получать эти значения.. Это было более четко задокументировано в предыдущих версиях, но это все еще указано в тексте справки для rand
(типа help rand
, а не doc rand
).
однако, поскольку он производит двойники, существует только конечное число значений, которые он фактически произведет. Точный набор варьируется в зависимости от используемого алгоритма RNG. Для Mersenne twister, алгоритм по умолчанию, возможные значения кратны 2^(-53), в пределах открытого интервала (0,1)
. (См.doc RandStream.list
, а затем "выбор генератора случайных чисел"для информации о других генераторах).
обратите внимание, что 2^(-53) является eps/2. Таким образом, это эквивалентно рисованию из закрытого интервала [2^(-53), 1-2^(-53)]
или [eps/2, 1-eps/2]
.
вы можете масштабировать этот интервал [0,1]
путем вычитания eps / 2 и деления на 1-eps. (Используйте format hex
для отображения достаточной точности чтобы проверить это на уровне бит).
так x = (rand-eps/2)/(1-eps)
должен дать вам значения на закрытом интервале [0,1]
.
но я должен предупредить: они приложили много усилий, чтобы убедиться, что выход rand
дает соответствующее распределение любого данного в (0,1)
, и я не думаю, что вы получите те же хорошие свойства на [0,1]
если вы примените масштабирование предложил я. Мои знания математики с плавающей запятой и RNGs не до объяснения почему, или что ты можешь с этим сделать.
математически, если вы образец от (непрерывное) равномерное распределение на замкнутом интервале [0 1], значения 0 и 1 (или любое значение, по сути) имеют вероятность строго 0.
программно,
если у вас есть случайный генератор, который вырабатывает значения
double
тип закрытые интервал [0 1], вероятность попадания значения 0 или 1, не равна нулю, но это так маленьким им можно пренебречь.если случайный генератор производит значения из открыть интервал (0, 1), вероятность получения значения 0 или 1, составляет строго ноль.
таким образом, вероятность либо строго равна нулю, либо настолько мала, что ею можно пренебречь. Поэтому вам не стоит беспокоиться об этом: в любом случае вероятность равна нулю для практических целей. Даже если rand
были типа (1), и таким образом мог бы производства 0
и 1
, это произведет их с такой малой вероятностью, что вы "никогда" не увидите эти значения.
звучит странно? Такое случается с любым числом. Ты "никогда"не увидишь!--1--> когда-либо выводя ровно 1/3, либо. Существует так много возможных выходов, все они одинаково вероятны, что вероятность любого заданного выхода практически равна нулю.
Я просто попытался это:
octave:1> max(rand(10000000,1))
ans = 1.00000
octave:2> min(rand(10000000,1))
ans = 3.3788e-08
не дал мне 0 строго, поэтому следите за операциями с плавающей запятой.
редактировать
хотя я и сказал,следите за операциями с плавающей точкой я попался на это. Как отметил @eigenchris:
format long g
octave:1> a=max(rand(1000000,1))
a = 0.999999711020176
Он дает плавающее число закрыть к одному, не равному, как вы можете видеть теперь после изменения точности, как предложил @rayryeng.
хотя и не прямо на вопрос здесь, я считаю полезным ссылаться на это сообщение Октава-случайное число генерации который имеет один вкладыш для генерации 1s и 0s с помощью r = rand > 0.5
.