Allora doppione è un intero che non viene inizializzato, il primo uso che se ne fa è all'istruzione:
codice:
doppione = RANDOM(15)
Per quanto riguarda invece l'unicità avevo omesso un particolare:
i numeri contenuti in quel vettore rappresentano, in un numero binario, la posizione degli 1.
Per esempio:
bit: 15 numero_uni: 8

num1: 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1
num2: 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1

Per applicare lo scambio prendo in considerazione le posizioni degli 1, quindi da ottenere due array si fatti:

v1: 2 4 5 7 9 10 13 14
v2: 4 6 8 10 11 12 13 14

Ipotetico numero di taglio: 4

applicandolo scambio ottengo:

v1: 2 4 5 7 11 12 13 14
v2: 4 6 8 10 9 10 13 14

E i conseguenti individui saranno:

num1: 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 numero di uni: 8
num2: 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 numero di uni: 7


così nella parte dentro if viene sostituita con:
codice:
/*prendo un altro nodo random, che non era già stato preso*/
                    do
                    {
                        doppione = RANDOM(nodi);
                    }while(num1[doppione] == 1);
E nell'if sottostante al posto di num1 ci metto num2.
Ecco come fa a generare solo numeri unici...o almeno credo!
A volte capita che dentro a una cella di v1/2 non ci sia scritto niente, oppure un numero tipo 5489521246856 quindi quando tenta di accedere crasha tutto.