2017-09-08 1 views
0

Comment générer une séquence de paires aléatoires sans répétition de paires? Le code suivant génère déjà les paires, mais ne pas éviter les répétitions:Générer une cellule avec des paires aléatoires sans répétitions

for k=1:8 
    Comb=[randi([-15,15]) ; randi([-15,15])]; 
    T{1,k}=Comb; 
end 

Quand je suis arrivé en cours d'exécution:

T= [-3;10] [5;2] [1;-5] [10;9] [-4;-9] [-5;-9] [3;1] [-3;10] 

La paire [-3,10] est répétée, qui ne peut se produire. PS: Les entrées peuvent être positives ou négatives.

Y at-il une fonction intégrée pour cela? Toute suggestion pour résoudre cela?

+0

Avez-vous la boîte à outils Statistiques? –

+0

Copie possible de [Générer efficacement des paires uniques d'entiers] (https://stackoverflow.com/questions/15793172/efficiently-generating-unique-pairs-of-integers) –

+0

Merci pour le lien (https://stackoverflow.com/questions/15793172/efficient-generation-unique-paires-of-entiers) mais les solutions présentées ne fonctionnent que pour les combinaisons positives. – hello123

Répondre

2

Si vous avez la statistique Boîte à outils, vous pouvez utiliser randsample pour goûter 8 numéros 1-31^2 (où 31 est la taille de la population), sans remplacement, puis « déballer » chaque numéro obtenu dans les deux composantes d'une paire :

s = -15:15; % population 
M = 8; % desired number of samples 
N = numel(s); % population size 
y = randsample(N^2, M); % sample without replacement 
result = s([ceil(y/N) mod(y-1, N)+1]); % unpack pair and index into population 

Exemple exécuté:

result = 
    14  1 
    -5  7 
    13 -8 
    15  4 
    -6 -7 
    -6 15 
    2  3 
    9  6 
+0

Merci! Ça a marché. Mais seulement pour les combinaisons positives. Et je voulais aussi pour les combinaisons négatives. – hello123

+1

@emanbap C'est parce que vous avez changé votre question après avoir répondu. Quoi qu'il en soit, voir la réponse éditée –

+0

Merci! Ça marche. – hello123

2

Vous pouvez utiliser ind2sub:

n = 15; 
m = 8; 
[x y]=ind2sub([n n],randperm(n*n,m)); 
+1

Meilleure approche jusqu'à présent, à mon avis. 'ind2sub' peut facilement être généralisé à plus de' 2' composants –

+1

Avez-vous besoin de changer l'ordre d'entrée à 'ind2sub'? –

+0

Merci, mais n'a pas travaillé pour moi. – hello123

1

Deux possibilités:

1.

M = nchoosek(1:15, 2); 
T = datasample(M, 8, 'replace', false); 

2.

T = zeros(8,2); 
k = 1; 
while (k <= 8) 
    t = randi(15, [1,2]); 
    b1 = (T(:,1) == t(1)); 
    b2 = (T(:,2) == t(2)); 
    if ~any(b1 & b2) 
    T(k,:) = t; 
    k = k + 1; 
    end 
end 

La première méthode est probablement plus rapide, mais occupe plus de mémoire et peut ne pas être possible à très grande échelle nombres (ex: si au lieu de 15, le maximum était 50000), auquel cas vous devez aller avec 2.

+0

Merci! Bonne mise en œuvre. Les deux fonctionnent! :) – hello123