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