Neanche io sono un esperto e non ho mai studiato la complessità computazionale, ma con un pizzico di buon senso si intuisce che come strategia non è molto efficace!
Immagina di avere le 10 carte di denari di un mazzo di carte napoletane e di voler generare una sequenza casuale delle suddette 10 carte. Applicando la tua strategia avremmo le seguenti fasi:
- mischiare le carte;
- rivelare la carta in cima al mazzetto;
- controllare se essa è già presente nella nostra sequenza;
- se lo è pazienza, altrimenti aggiornare la sequenza;
- rimettere la carta nel mazzo e ripetere le fasi precedenti finché la sequenza non è completa.
Invece applicando la mia idea
Nippolo ha scritto:
... sarebbe meglio riempire un vettore con i numeri che vanno da 1 a n^2 e poi "mischiarlo"!
le fasi sarebbero:
- mischiare le carte;
- finito!
ma di funzionare funziona, non riesco a capire come potrebbe non generare tutti i numeri dell'intervallo visto che prova un'infinità di tentativi
La mia più che altro era una "provocazione", in ogni caso qualcuno più esperto saprà dirci se la mia preoccupazione potrebbe in teoria rivelarsi fondata!
L'unica cosa che eseguendolo mi ha lasciato perplesso è che anche su 10000 tentativi non ne trova uno corretto, però c'è da dire che il numero di combinazioni è 9^9>>10000>>numero di quadrati magici
Non sono sicuro di aver capito a pieno il discorso che fai sulle combinazioni, in ogni caso ragioniamo:
- per un cubo di ordine n dovrebbero esserci (n^2)! cubi diversi possibili. Infatti il seguente cubo di ordine 3
1 2 3
4 5 6
7 8 9
può essere "linearizzato" come
1 2 3 4 5 6 7 8 9
e per il suddetto vettore esistono 9! permutazioni;
- da un pdf ho letto che
E’ stato calcolato che, senza contare rotazioni e riflessioni, esistono:
- 1 quadrato magico di ordine 3;
- 880 quadrati magici di ordine 4;
- 275.305.224 quadrati magici di ordine 5.
dove le rotazioni sono 3 (90°, 180°, 270°) e le riflessioni sono 4 (simmetria orizzontale, simmetria verticale, simmetria rispetto alla diagonale principale, simmetria rispetto alla diagonale secondaria), ossia per ogni possibile quadrato ne esistono altri 7 "equivalenti". Quindi contando anche le rotazioni e le riflessioni avremo:
# 8*1 quadrati magici di ordine 3;
# 8*880 quadrati magici di ordine 4;
# 8*275.305.224 quadrati magici di ordine 5.
Da quanto detto in precedenza si deduce che la probabilità che un quadrato di ordine 3 sia magico è:
(8*1)/(3^2)!=0,0022% ossia in media 1/45360
Da quanto detto in precedenza si deduce che la probabilità che un quadrato di ordine 4 sia magico è:
(8*880)/(4^2)!=0,000000034% ossia in media 1/2971987200
Quindi per testare il programma potresti utilizzare i suddetti dati... per esempio ripetendo l'esperimento per 50000 volte su un quadrato di ordine 3 dovresti beccare almeno 1 quadrato magico!
P.S.
Fatemi sapere se ho scritto qualche sciocchezza!