2016-01-22 4 views
1

Цель состоит в том, чтобы генерировать шесть номеров лото, но, очевидно, они должны быть уникальными. Это должно быть записано в виде функции, хотя, следующее эквивалент с использованием библиотеки:MATLAB randsample в форме функции

(randsample(42,6))' 

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

function numbers = lottonumbers() 

    pool = 1:42; 
    numbers = zeros(1,6); 

    for i=1:6 
     for j=42-i 

      randIndex = round(1+j*rand); 
      randNumber = pool(randIndex); 
      numbers(i) = randNumber; 

      if randIndex==1 
       pool = pool(2:end); 
      else if randIndex==length(pool) 
       pool = pool(1:(end-1)); 
      else 
       pool = [pool(1:randIndex-1), pool(randIndex+1:end)]; 
       end 
      end 
     end 
    end 

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

ответ

1

Lotto основан на перестановках, где заказ не играет роли.

% p = randperm(n,k) returns a row vector containing k unique integers selected randomly from 1 to n inclusive. 
randperm(42, 6) 

должен сделать трюк.

Из кода: «Это иногда называют K-перестановкой 1: N или как выборкой без замены».

0

Другим подходом является использование rejection sampling: сгенерируйте числа независимо, и если они не все разные, начните снова. Это эффективно до тех пор, пока вероятность того, что числа не будут различны, невелико.

N = 6; 
M = 42; 
done = false; 
while ~done 
    result = randi(M,1,N); %// generate N numbers from [1,...,M] 
    done = all(diff(sort(result))); %// if all are different, we're done 
end 
Смежные вопросы