Autore Topic: Simulare il mescolare carte  (Letto 123 volte)

Offline vuott

  • Senatore Gambero
  • ******
  • Post: 6.144
    • Mostra profilo
" Chi non vede il non senso del mondo, è vano a sua volta. "

(B. Pascal, 1623 – 1662)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 1.634
  • Tonno verde
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #1 il: 25 Febbraio 2017, 15:19:38 »
http://forum.ubuntu-it.org/viewtopic.php?p=4539398#p4539369

https://www.iprogrammatori.it/forum-programmazione/cplusplus/programmazione-t30534.html#p8571824

Scusa ma purtroppo non so leggere il C potresti essere così gentile di tradurre l'algoritmo di Knuth in Gambas?
Codice: [Seleziona]
    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;
        }
    }

 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 744
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #2 il: 25 Febbraio 2017, 15:57:26 »
La mia immancabile interpretazione personale (stavolta senza errori, vero Gian? :P :P ):

Codice: [Seleziona]
' 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
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Senatore Gambero
  • ******
  • Post: 6.144
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #3 il: 25 Febbraio 2017, 17:54:23 »
... tradurre l'algoritmo di Knuth in Gambas?

Eccolo di seguito anche inserito in un esempio pratico:

Codice: [Seleziona]
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

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.



« Ultima modifica: 25 Febbraio 2017, 18:12:04 da vuott »
" Chi non vede il non senso del mondo, è vano a sua volta. "

(B. Pascal, 1623 – 1662)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 1.634
  • Tonno verde
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #4 il: 27 Febbraio 2017, 17:58:01 »
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: [Seleziona]
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

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 1.634
  • Tonno verde
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #5 il: 28 Febbraio 2017, 11:07:43 »
Ah mi sono dimenticato di chiederti come mai avevi messo a Long le variabili della funzione, volevi metterle a Byte e ti è scappato Long oppure mi sfugge qualcosa?
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Senatore Gambero
  • ******
  • Post: 6.144
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #6 il: 28 Febbraio 2017, 13:42:05 »
......volevi metterle a Byte e ti è scappato Long

Ovviamente stai scherzando....
" Chi non vede il non senso del mondo, è vano a sua volta. "

(B. Pascal, 1623 – 1662)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 1.634
  • Tonno verde
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #7 il: 28 Febbraio 2017, 13:47:22 »
......volevi metterle a Byte e ti è scappato Long

Ovviamente stai scherzando....

No non sto scherzando, qui si parla di massimo 52 numeri e byte li copre abbondantemente  :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 1.634
  • Tonno verde
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #8 il: 28 Febbraio 2017, 14:15:28 »
OK, mi rispondo da solo:  :D
Tu hai riportato la traduzione dell'algoritmo che permette di mescolare numeri fino a cifre notevoli, non tenendo conto dell'oggetto.
Io invece tenendone conto ho fatto la domanda.

Tutto chiaro, spero.
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Senatore Gambero
  • ******
  • Post: 6.144
    • Mostra profilo
Re:Simulare il mescolare carte
« Risposta #9 il: 28 Febbraio 2017, 17:39:07 »
Codice: [Seleziona]
' size_t Dim_size_t()
' Ritorna la quantità di memoria in byte occupata dal tipo "size_t" di C
Private Extern Dim_size_t() As Long In "/tmp/quantitas"


Public Sub Main()

  Dim qnt As Byte
 
   If System.Architecture <> "x86_64" Then Return
   CreaSo()
   
   qnt = CByte(Dim_size_t())
   
   Print "Dimensione di\n\nC       'size_t': "; qnt; " byte"
   Print "Gambas  'Long':   "; SizeOf(gb.Long); " byte"

End


Private Procedure CreaSo()
 
  File.Save("/tmp/quantitas.c", "#include <stdio.h>\n\n" &
            "size_t Dim_size_t() {\n\n" &
            "  return sizeof(size_t);\n\n}")
 
  Shell "gcc -o /tmp/quantitas.so /tmp/quantitas.c -shared" Wait
 
End
" Chi non vede il non senso del mondo, è vano a sua volta. "

(B. Pascal, 1623 – 1662)