Allora doppione è un intero che non viene inizializzato, il primo uso che se ne fa è all'istruzione:
Per quanto riguarda invece l'unicità avevo omesso un particolare:codice:doppione = RANDOM(15)
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:
E nell'if sottostante al posto di num1 ci metto num2.codice:/*prendo un altro nodo random, che non era già stato preso*/ do { doppione = RANDOM(nodi); }while(num1[doppione] == 1);
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.