2015-06-18 2 views
1

Я хочу создать случайную двоичную последовательность с отношением 50%, то есть то же количество 0s и 1s. Это то, что я до сих пор:Генерировать случайную двоичную последовательность с определенным отношением

length_sequence = 1000; 
ratio = 0.5; 
A = logical(randi([0 1],length_sequence,1)); 

Единственная проблема заключается в том, что я не знаю, как установить соотношение.

+1

Вы имеете в виду отношение _deterministic_ (вам нужно 500 единиц и 500 нулей в каждой реализации) или _пробабилистическое отношение (реализация может иметь больше, чем нули, но соотношение сохраняется во многих реализациях) ? –

+0

Точка @LuisMendo является действительной. В зависимости от того, какой из них вы хотите, код будет совсем другим. – rayryeng

ответ

3

соотношения можно интерпретировать как детерминированный (вы хотите 500 единиц и 500 нулей в каждой реализации 1000 значений) или вероятностного (реализации может иметь больше из них, чем нули, но отношение имеет более очень большое количество реализаций).

Ваш код работает для вероятностной интерпретации, поэтому я предполагаю, что вы имеете в виду детерминированный. В этом случае, заполнить A со значениями ноль и один в любом порядке (например: сначала все из них, то все нули), а затем применить случайную перестановку:

length_sequence = 1000; 
ratio = 0.5; %// interpreted as proportion of ones that there must be in any realization 
A = zeros(1,length_sequence); 
A(1:round(length_sequence*ratio)) = 1; 
A = A(randperm(length_sequence)); 
3

Вы можете подойти к этому в одном из двух пути (а-ля Луис Mendo):

подход № 1 - Детерминированный

Если вы знаете, что вам нужно ровно 500 единиц и 500 нулей на каждый раз, когда вы создаете этот вектор, вы можете создать набор индексов из От 1 до 1000 (или вообще от 1 до столько элементов, сколько вы хотите - num_elements) a й экстракт 500 (или вообще round(ratio*num_elements), где ratio находится между [0,1]). Вы бы затем использовать эти показатели и установить расположение в начальной нулевой вектор 1:

num_elements = 1000; 
ratio = 0.5; %// 50% 
ind = randperm(num_elements, round(ratio*num_elements)); 
A = zeros(num_elements,1) == 1; %// Convert to logical 
A(ind) = 1; 

Подход № 2 - вероятностный

Вы можете генерировать равномерно распределенные случайные значения из [0-1] и порога с 0,5, или ratio:

num_elements = 1000; 
ratio = 0.5; 
A = rand(num_elements, 1) >= ratio; 

Это в вероятностном смысле заполняет каждое значение в векторе с 50% (или вообще ratio) шанс сделать значение 0 и 50% (или вообще 1 - ratio) вероятность сделать значение 1.

+1

У нас была такая же идея! :-) –

+1

@ LuisMendo - Это один раз в жизни, когда у меня было такое же решение, как и вы: P +1 для вас. – rayryeng

+1

Отлично работает! Спасибо вам обоим! (Я искал детерминированный подход) – mat

Смежные вопросы