Функция 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.