Равномерное распределение двоичных значений в Matlab

У меня есть требование для генерации заданного количества N векторов заданного размера, каждый из которых соответствует равномерному распределению 0 и 1.

Это то, что я делаю в данный момент, но я заметил, что распределение имеет сильный пик на половине единиц и половине нулей, что не годится для того, что я делаю:

a = randint(1, sizeOfVector, [0 1]);

Функция unifrnd выглядит многообещающе для того, что мне нужно, но я не могу понять, как вывести двоичный вектор такого размера.

Могу ли я использовать функцию unifrnd (и если да, то как бы это было оценено!) Или есть ли другой более удобный способ получить такой набор векторов?

Любая помощь приветствуется!

Примечание 1: просто для уверенности. Вот что на самом деле говорится в требовании:

случайно выбрать N векторов заданного размера, которые равномерно распределены по [0;1]

Примечание 2: я создаю начальные конфигурации для Cellular Automata, поэтому у меня могут быть только двоичные значения [0;1].


person JohnIdol    schedule 14.03.2010    source источник
comment
Вы уверены, что под [0; 1] они не подразумевают интервал всех действительных чисел между 0 и 1?   -  person Thomas    schedule 14.03.2010
comment
Кроме того, если вы равномерно рисуете n чисел из набора {0, 1}, то следует ожидать, что примерно половина из них равна 0, а половина — 1. В конце концов, это и есть идея равномерного распределения.   -  person Thomas    schedule 14.03.2010
comment
Я уверен - я генерирую начальные конфигурации для клеточных автоматов и там всего 2 состояния: ВКЛ/ВЫКЛ [0, 1]   -  person JohnIdol    schedule 14.03.2010
comment
@ Томас интересно, так ты говоришь, что у меня уже есть равномерное распределение?   -  person JohnIdol    schedule 14.03.2010


Ответы (2)


Чтобы сгенерировать 1 случайный вектор с элементами из {0, 1}:

unidrnd(2,sizeOfVector,1)-1

Остальные варианты аналогичны.

person kennytm    schedule 14.03.2010
comment
+1 - спасибо! кажется, работает, но у меня проблемы с интерпретацией выражения, не могли бы вы расширить, а также объяснить разницу между тем, что вы предлагаете, и тем, что у меня есть в настоящее время? - person JohnIdol; 14.03.2010
comment
@John: unidrnd = Дискретные равномерные случайные числа. unidrnd(N,m,n) генерирует матрицу m*n со случайными числами в диапазоне {1,2,...,N}. -1 должен вернуть результат к {0,1,...,N-1}. См. mathworks.com/access/helpdesk/help/toolbox/stats. /unidrnd.html. - person kennytm; 14.03.2010
comment
хорошо, спасибо, это объясняет использование unidrnd - все еще пытаюсь понять, чем это отличается от того, что у меня есть. - person JohnIdol; 14.03.2010
comment
просто чтобы уточнить мой предыдущий комментарий - в чем разница между использованием randint(1, 5, [0 1]) и unidrnd(2,1,5)-1 ? - person JohnIdol; 14.03.2010
comment
@John: я не знаю в MATLAB, но в Octave 3.0.3 существует только unidrnd, а randint/randi нет. - person kennytm; 14.03.2010

Если вы хотите получить равномерно распределенные 0 и 1, вы должны использовать Рэнди. Однако, исходя из требования, я думаю, что векторы могут иметь реальные значения, для которых вы должны использовать ранд

%# create a such that each row contains a vector

a = randi(1,N,sizeOfVector); %# for uniformly distributed 0's and 1's

%# if you want, say, 60% 1's and 40% 0's, use rand and threshold
a = rand(N,sizeOfVector) > 0.4; %# maybe you need to call double(a) if you don't want logical output

%# if you want a random number of 1's and 0's, use
a = rand(N,sizeOfVector) > rand(1);
person Jonas    schedule 14.03.2010
comment
спасибо, но у меня могут быть только 0 или 1, как объяснено в вопросе - разве ранди не то же самое, что и рандинт? единственная разница в том, что randint устарел, я думаю :) - person JohnIdol; 14.03.2010
comment
Ага, понятно. Да, randi — это «современная» версия randint. Кроме того, да, равномерное распределение означает, что все возможные значения выбираются с одинаковой частотой. - person Jonas; 14.03.2010