Si je vous comprends bien vous avez des vecteurs N, chacun avec un nombre différent d'éléments (appel de la taille de le ième vecteur Si) et vous qui choisir M combinaisons d'éléments de ces vecteurs sans répétition. Chaque combinaison serait N éléments, un élément de chaque vecteur.
Dans ce cas, le nombre de permutations possibles est le produit des dimensions des vecteurs, qui, faute d'une certaine forme de mise en équation, je vais appeler P et calculer en C++:
std::vector<size_t> S(N);
// ...populate S...
size_t P = 1;
for(size_t i=0;i<S.size();++i)
P *= S[i];
Alors maintenant le problème devient de choisir M nombres distincts entre 0 et P-1, puis convertir chacun de ces M nombres en N indices dans les vecteurs originaux. Je peux penser à quelques façons de calculer ces nombres M, peut-être le plus simple est de continuer à dessiner des nombres aléatoires jusqu'à ce que vous obteniez M distincts (échantillonnage de rejet efficace de la distribution).
La partie légèrement plus compliquée est de transformer chacun de vos M nombres en un vecteur d'indices. Nous pouvons le faire avec
size_t m = /* ... one of the M permutations */;
std::vector<size_t> indices_m(N);
for(size_t i=0; i<N; ++i)
{
indices[i] = m % S[i];
m /= S[i];
}
qui hache essentiellement m en morceaux pour chaque index, un peu comme vous le feriez lors de l'indexation d'un tableau 2D représentée comme un tableau 1D.
Maintenant, si nous prenons votre N = 3 exemple, nous pouvons obtenir les 3 éléments de notre permutation avec
v1 [index [0]] v2 [indices [1]] v3 [indices [2]]
générer autant de valeurs distinctes de m que nécessaire.
Veuillez utiliser des noms de variables différents pour des choses différentes si ce n'est pas la même valeur. Vous utilisez n trois fois, et déclarez que dans deux cas ils ont des valeurs différentes. – Yacoby
Avez-vous besoin de "N fois choisir 1 élément de M collections"? – xtofl