Algoritmo per mischiare
Moderatori: Gianfranco, Bruno
Questo forum è una sezione del PORTALE DI BASE CINQUE
Algoritmo per mischiare
di seguito l'algoritmo che ho sempre usato per mischiare n quantità di variabili
nell'esempio mischio 52 numeri in 208 passaggi..
mi chiedevo se è possibile abbassare il numero di passaggi, ma per ora non trovo soluzione migliore.
'PREPARO VARIABILI
For c = 1 To 52
Numero(c) = c
Next
'MISCHIO CON LO SWAP
conto2 = 0
For c = 1 To 52
x = 1 + Int(Rnd * 52)
Memo = Numero(x)
Numero(x) = Numero(c)
Numero(c) = Memo
conto2 = conto2 + 4
Next
'Totale operazioni (conto2): 208
nell'esempio mischio 52 numeri in 208 passaggi..
mi chiedevo se è possibile abbassare il numero di passaggi, ma per ora non trovo soluzione migliore.
'PREPARO VARIABILI
For c = 1 To 52
Numero(c) = c
Next
'MISCHIO CON LO SWAP
conto2 = 0
For c = 1 To 52
x = 1 + Int(Rnd * 52)
Memo = Numero(x)
Numero(x) = Numero(c)
Numero(c) = Memo
conto2 = conto2 + 4
Next
'Totale operazioni (conto2): 208
Re: Algoritmo per mischiare
se tu usi R il comando
produce una permutazione "a caso" dei numeri da $1$ a $52$: es.
Codice: Seleziona tutto
x <- sample(52)
Codice: Seleziona tutto
x <- sample(52)
print(x)
[1] 44 29 38 43 37 35 2 12 26 14 52 34 49 18 1 13 5 30 48 42 40 31 28 19 41 24 17 10 7 22 9 23 36 21 39 11 4 3 20 32 25 51 6 16 50 45 46 27 47 15 33 8
il panurgo
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"
Re: Algoritmo per mischiare
vabbè ma immagino che al suo interno ci sia un codice che a sua volta consuma tot di operazioni che non possiamo neppure sapere quante sono
a volte perdo tempo a cercare soluzioni impossibili, ho già desistito
a volte perdo tempo a cercare soluzioni impossibili, ho già desistito

Re: Algoritmo per mischiare
Se lo scopo è quello di diminuire il numero delle operazioni nel loro complesso, questo è un discorso; se invece è quello di fare una buona mischiata di un doppio mazzo di carte, non starei tanto a guardare quante sono le operazioni, se il tempo di soluzione del problema è brevissimo, pur se con molte operazioni.
Ad esempio, le 52 carte, con Decimal Basic, le mischierei come segue, ottenendo il risultato in qualche decimo di secondo:
DIM a(52)
RANDOMIZE
FOR m=1 to 52
DO
LET x=1+INT(RND*52)
IF a(x)=0 THEN
LET a(x)=m
EXIT do
END IF
LOOP
PRINT USING "###)":m;
PRINT x
NEXT M
END
Inoltre c'è da considerare che secondo la tipologia dei comandi e dei linguaggi cambiano anche i tempi di elaborazione.
Ad esempio, le 52 carte, con Decimal Basic, le mischierei come segue, ottenendo il risultato in qualche decimo di secondo:
DIM a(52)
RANDOMIZE
FOR m=1 to 52
DO
LET x=1+INT(RND*52)
IF a(x)=0 THEN
LET a(x)=m
EXIT do
END IF
LOOP
PRINT USING "###)":m;
PRINT x
NEXT M
END
Inoltre c'è da considerare che secondo la tipologia dei comandi e dei linguaggi cambiano anche i tempi di elaborazione.
_________________
$\text { }$ciao
ciao
E' la somma che fa il totale (Totò)
$\text { }$ciao
E' la somma che fa il totale (Totò)
Re: Algoritmo per mischiare
sei sopra le 208 operazioni
Re: Algoritmo per mischiare
lo scopo è quello di usare la matematica per migliorare le cose
Re: Algoritmo per mischiare
Allora Lucignolo, studiare un algoritmo più efficiente di un altro, va bene, è un miglioramento, specie se l'elaborato è complicato e richiede magari ore o giorni di lavoro.
Poi, circa l’uso della matematica per migliorare le cose, il discorso si fa più complicato e ci porterebbe molto lontano, perché le variabili in gioco sono tante e spesso poco note o non condivise.
Entrando nello specifico delle carte da mischiare, direi che l’algoritmo di Panurgo con un solo comando non è da discutere: chi ha studiato quel comando a livello del linguaggio utilizzato, certamente non sarà l’ultimo arrivato ed avrà pur considerato quanto tu stesso dici, relativamente al sottofondo più vicino al linguaggio macchina su cui il comando è costruito.
Certamente i 4 comandi da te evidenziati sono meno di quelli della mia routine, ma la valutazione dell’efficienza e della validità di un algoritmo non può fermarsi solo al conteggio dei comandi, nel cui sottofondo non saprei cosa c’è.
Ad esempio, mi risulta che il ciclo DO-LOOP sia molto efficiente e che un EXITO DO non valga quanto il confronto fra due variabili o quanto un FOR-NEXT.
Direi che il confronto fra due routine andrebbe fatto più sui tempi di esecuzione, piuttosto che sul conteggio dei comandi, per cui ho reiterato per 10.000 volte le due routine ed ho trovato che la mia ha impiegato 84 centesimi di secondo più della tua, che sembrano meno importanti rispetto alla differenza fra 208 e 236, calcolati come media di una reiterazione della routine.
Infine, hai provato a stampare la tua routine più di una volta e mettere a confronto fra loro i risultati dell’operazione?
A me sembra che il risultato sia sempre lo stesso e che nella routine probabilmente manchi un comando relativo alla randomizzazione, ma non ci metto la mano sul fuoco, perché per poter eseguire la tua routine ho dovuto farlo col mio Decimal Basic e non so se questo abbia cambiato qualcosa.
In linea di massima i linguaggi Basic hanno un comando del tipo RANDOMIZE o RANDOMIZE TIMER o altro similare, basto sull’’orologio del computer, senza del quale ogni volta la casualità non è più casuale..
Comunque, anche da questi confronti utili e costruttivi emerge il pregio di Base5., tanto che c’è stato un periodo in cui alcuni insegnanti frequentatori lo consigliavano ai loro alunni. Forse oggi il tempo viene molto di più dedicato all’uso del cellulare.
Poi, circa l’uso della matematica per migliorare le cose, il discorso si fa più complicato e ci porterebbe molto lontano, perché le variabili in gioco sono tante e spesso poco note o non condivise.
Entrando nello specifico delle carte da mischiare, direi che l’algoritmo di Panurgo con un solo comando non è da discutere: chi ha studiato quel comando a livello del linguaggio utilizzato, certamente non sarà l’ultimo arrivato ed avrà pur considerato quanto tu stesso dici, relativamente al sottofondo più vicino al linguaggio macchina su cui il comando è costruito.
Certamente i 4 comandi da te evidenziati sono meno di quelli della mia routine, ma la valutazione dell’efficienza e della validità di un algoritmo non può fermarsi solo al conteggio dei comandi, nel cui sottofondo non saprei cosa c’è.
Ad esempio, mi risulta che il ciclo DO-LOOP sia molto efficiente e che un EXITO DO non valga quanto il confronto fra due variabili o quanto un FOR-NEXT.
Direi che il confronto fra due routine andrebbe fatto più sui tempi di esecuzione, piuttosto che sul conteggio dei comandi, per cui ho reiterato per 10.000 volte le due routine ed ho trovato che la mia ha impiegato 84 centesimi di secondo più della tua, che sembrano meno importanti rispetto alla differenza fra 208 e 236, calcolati come media di una reiterazione della routine.
Infine, hai provato a stampare la tua routine più di una volta e mettere a confronto fra loro i risultati dell’operazione?
A me sembra che il risultato sia sempre lo stesso e che nella routine probabilmente manchi un comando relativo alla randomizzazione, ma non ci metto la mano sul fuoco, perché per poter eseguire la tua routine ho dovuto farlo col mio Decimal Basic e non so se questo abbia cambiato qualcosa.
In linea di massima i linguaggi Basic hanno un comando del tipo RANDOMIZE o RANDOMIZE TIMER o altro similare, basto sull’’orologio del computer, senza del quale ogni volta la casualità non è più casuale..
Comunque, anche da questi confronti utili e costruttivi emerge il pregio di Base5., tanto che c’è stato un periodo in cui alcuni insegnanti frequentatori lo consigliavano ai loro alunni. Forse oggi il tempo viene molto di più dedicato all’uso del cellulare.

_________________
$\text { }$ciao
ciao
E' la somma che fa il totale (Totò)
$\text { }$ciao
E' la somma che fa il totale (Totò)
Re: Algoritmo per mischiare
si manca il randomize, non ci ho fatto caso a metterlo perchè il mio scopo è solo quello di diminuire le operazioni
è un puro gioco di ottimizzazione del codice, una sfida con me stesso
ho fatto tante valutazioni ho valutato il risultato della mischiata perfetta da 208 operazioni ( task o token non ricordo il termine esatto )
ho provato a trasformare tutti i 52 numeri in una sola stringa e tramite il random spezzarla e riunirla nei punti esatti
ho provato a diminuire il numero di pescaggi per lo swap, ,le carte si mischiano ugualmente, ma non con la stessa efficienza
ho scoperto che esistono anche due altri modi per scambiare il contenuto di due variabili senza usarne una terza temporanea, ma richiede sempre tre operazioni
ho scoperto che la mischiata swap lascia solo da 0 a 1 carta nella medesima posizione iniziale, e questo mi pare uno degli obiettivi base da raggiungere qualunque sia il sistema usato
dopo 3-4 giorni ho trovato un sistema che mi mischia le carte rispettando tutte le considerazione della premessa con una media di 160 operazioni senza utilizzare lo swap con tre passaggi, e partendo sempre da una base ordinata: a(1)=1, a(2)=2 .... a(52)=52
quanti appassionati di basic o programmazione ci sono nel forum?
è un puro gioco di ottimizzazione del codice, una sfida con me stesso
ho fatto tante valutazioni ho valutato il risultato della mischiata perfetta da 208 operazioni ( task o token non ricordo il termine esatto )
ho provato a trasformare tutti i 52 numeri in una sola stringa e tramite il random spezzarla e riunirla nei punti esatti
ho provato a diminuire il numero di pescaggi per lo swap, ,le carte si mischiano ugualmente, ma non con la stessa efficienza
ho scoperto che esistono anche due altri modi per scambiare il contenuto di due variabili senza usarne una terza temporanea, ma richiede sempre tre operazioni
ho scoperto che la mischiata swap lascia solo da 0 a 1 carta nella medesima posizione iniziale, e questo mi pare uno degli obiettivi base da raggiungere qualunque sia il sistema usato
dopo 3-4 giorni ho trovato un sistema che mi mischia le carte rispettando tutte le considerazione della premessa con una media di 160 operazioni senza utilizzare lo swap con tre passaggi, e partendo sempre da una base ordinata: a(1)=1, a(2)=2 .... a(52)=52
quanti appassionati di basic o programmazione ci sono nel forum?
Re: Algoritmo per mischiare
invertire le variabili Lucignolo, lo fai semplicemente con una somma e due sottrazioni
int a=5, b=3; //a=5, b=3
a=a+b; //a=8, b=3
b=a-b; //a=8, b=5
a=a-b; //a=3, b=5
con due funzioni inverse qualsiasi….
che siano anche una moltiplicazione e due divisioni,
o una potenza e due radici in base n
o con 3 logaritmi….
chiaramente poi diventano troppo lunghe per le risorse da utilizzare….
ma quella con i logaritmi mi ha sempre preso interesse…. ((((-;
usa quella che preferisci
int a=5, b=3; //a=5, b=3
a=a+b; //a=8, b=3
b=a-b; //a=8, b=5
a=a-b; //a=3, b=5
con due funzioni inverse qualsiasi….
che siano anche una moltiplicazione e due divisioni,
o una potenza e due radici in base n
o con 3 logaritmi….
chiaramente poi diventano troppo lunghe per le risorse da utilizzare….
ma quella con i logaritmi mi ha sempre preso interesse…. ((((-;
usa quella che preferisci
Re: Algoritmo per mischiare
w la matematica
Re: Algoritmo per mischiare
OK. da considare pure che nel basic di Decimal Basic, il comando SWAP è implementato esplicitamente, proprio con il comando SWAP
Ad esempio, nella precedente routine, invece di scrivere
Memo = Numero(x)
Numero(x) = Numero(c)
Numero(c) = Memo
sarebbe stato sufficiente scrivere:
SWAP numero(x), numero(c) o anche SWAP numero(c), numero(x)
Certamente, nel sottofondo esisterà comunque una terza variabile provvisoria in cui appoggiare provvisoriamente una delle due da scambiare, ma questo avverrà in modo più veloce e comunque ti consente di risparmiare la tastiera
Ad esempio, nella precedente routine, invece di scrivere
Memo = Numero(x)
Numero(x) = Numero(c)
Numero(c) = Memo
sarebbe stato sufficiente scrivere:
SWAP numero(x), numero(c) o anche SWAP numero(c), numero(x)
Certamente, nel sottofondo esisterà comunque una terza variabile provvisoria in cui appoggiare provvisoriamente una delle due da scambiare, ma questo avverrà in modo più veloce e comunque ti consente di risparmiare la tastiera
_________________
$\text { }$ciao
ciao
E' la somma che fa il totale (Totò)
$\text { }$ciao
E' la somma che fa il totale (Totò)
Re: Algoritmo per mischiare
infatti è impossibile swappare senza una fare almeno tre operazioni con o senza ausilio di una terza variabile...
Re: Algoritmo per mischiare
a=log_a(b)
b=b^(1/a)
a=b^a
questa la sequenza piu interessante.... come dicevo prima ((((-;
b=b^(1/a)
a=b^a
questa la sequenza piu interessante.... come dicevo prima ((((-;
Re: Algoritmo per mischiare
secondo me è più interessante questa:
X = X XOR Y
Y = Y XOR X
X = X XOR Y
X = X XOR Y
Y = Y XOR X
X = X XOR Y