Programmazione > Programmazione in generale
Simulare il mescolare carte
vuott:
http://forum.ubuntu-it.org/viewtopic.php?p=4539398#p4539369
https://www.iprogrammatori.it/forum-programmazione/cplusplus/programmazione-t30534.html#p8571824
Gianluigi:
--- Citazione da: vuott - 25 Febbraio 2017, 03:01:20 ---http://forum.ubuntu-it.org/viewtopic.php?p=4539398#p4539369
https://www.iprogrammatori.it/forum-programmazione/cplusplus/programmazione-t30534.html#p8571824
--- Termina citazione ---
Scusa ma purtroppo non so leggere il C potresti essere così gentile di tradurre l'algoritmo di Knuth in Gambas?
--- Codice: ---
void Knuth_perm(size_t size, unsigned int *pi) {
size_t i;
for (i = size; i > 1; --i) {
register unsigned int t;
size_t p = rand() % i;
t = pi[p];
pi[p] = pi[i -1];
pi[i -1] = t;
}
}
--- Termina codice ---
:ciao: :ciao:
Top Fuel:
La mia immancabile interpretazione personale (stavolta senza errori, vero Gian? :P :P ):
--- Codice: ---
' Gambas class file
Private mazzo[52] As Byte 'mazzo da 52 carte
Public Sub Form_Open()
Dim i, j, l As Byte
For i = 0 To 51 'riempiamo il mazzo
mazzo[i] = i + 1
Next
Randomize 'inizializziamo il generatore di numeri casuali
For i = 1 To 200 '200 scambi (numero settabile a piacere)
j = Rand(51) '2 posizioni a caso nel mazzo
l = Rand(51)
Swap mazzo[j], mazzo[l] 'le scambiamo tra di loro
Next
For i = 0 To 51 'vediamo il risultato
Print mazzo[i];;
Next
End
--- Termina codice ---
vuott:
--- Citazione da: Gianluigi - 25 Febbraio 2017, 15:19:38 ---... tradurre l'algoritmo di Knuth in Gambas?
--- Termina citazione ---
Eccolo di seguito anche inserito in un esempio pratico:
--- Codice: ---
Private Const RAND_MAX As Integer = 2147483647
Public Sub Main()
Dim ii As Integer[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Dim i As Integer
Knuth_perm(ii.Count, ii) ' Ritorno dei dati per "Indirizzo" '
For Each i In ii
Print i
Next
End
Private Function Knuth_perm(size As Long, _pi As Integer[]) ' Ritorno dei dati per "Indirizzo" '
Dim i, p As Long
Dim t As Integer
For i = size To 2 Step - 1
p = CInt(Rnd(0, RAND_MAX)) Mod i
t = _pi[p]
_pi[p] = _pi[i - 1]
_pi[i - 1] = t
Next
End
--- Termina codice ---
Per essere più filologicamente aderenti al codice, scritto in C, si sarebbe dovuto passare alla Funzione " Knuth_perm( ) " l'indirizzo di memoria della variabile vettoriale e quindi utilizzare lì una variabile di tipo "Puntatore", gestendola in lettura con le specifiche funzioni native di dereferenziazione ed in scrittura mediante i Memory Stream.
Gianluigi:
Molto interessante, geniale ampliare il rand sfruttando il resto della divisione che non potrà mai superare il divisore meno uno.
Interessante anche il ritorno dei dati per indirizzo, da me usato un sacco di volte in VBA ma completamente dimenticato.
Propongo questi due piccoli cambiamenti Gambas Like:
--- Codice: ---
Private Const RAND_MAX As Integer = 2147483647
Public Sub Main()
Dim ii As Integer[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Dim i As Integer
Knuth_perm(ii.Count, ii) ' Ritorno dei dati per "Indirizzo" '
For Each i In ii
Print i
Next
End
Private Function Knuth_perm(size As Long, _pi As Integer[]) ' Ritorno dei dati per "Indirizzo" '
Dim i, p As Long
For i = size To 2 Step - 1
p = Rand(1, RAND_MAX) Mod i
Swap _pi[p], _pi[i - 1]
Next
End
--- Termina codice ---
:ciao:
Navigazione
[0] Indice dei post
Vai alla versione completa