2.8 Giochi di carte

Avendo presentato le nozioni base del sistema di notazione di R, utilizziamo tali conoscenze per manipolare il data.frame. L’istruzione

deck[1:52, ]

ritorna tutte le righe e tutte e le colonne del data.frame deck. Le righe sono identificate dal primo indice, che va da 1 a 52. Permutare in modo casuale l’indice delle righe equivale a mescolare il mazzo di carte. Per fare questo, utilizziamo la funzione sample() ponendo replace=FALSE e size uguale alla dimensione del vettore che contiene gli indici da 1 a 52:

random <- sample(1:52, size = 52, replace = FALSE)
random
#>  [1] 41 35 51 22  3 10  2 15 11 16 46 21  7 19 43 17 27 50 39 44 14 18 40 47 31
#> [26] 30 52 37 20 33  6  9  5 49 13  4  8 28 32 45 42 26 36  1 48 23 24 29 34 25
#> [51] 38 12

Utilizzando il vettore random di indici permutati otteniamo il risultato cercato:

deck_shuffled <- deck[random, ]
head(deck_shuffled)
#>     face     suit value
#> 41 queen   hearts    12
#> 35  five diamonds     5
#> 51   two   hearts     2
#> 22  five    clubs     5
#> 3   jack   spades    11
#> 10  four   spades     4

Possiamo ora scrivere una funzione che include le precedenti istruzioni:

shuffle <- function(cards) {
  random <- sample(1:52, size = 52, replace = FALSE)
  return(cards[random, ])
}

Invocando la funzione shuffle() possiamo generare un data.frame che rappresenta un mazzo di carte mescolato:

deck_shuffled <- shuffle(deck)

Se immaginiamo di distribuire le carte di questo mazzo a due giocatori di poker, per il primo giocatore avremo:

deck_shuffled[c(1, 3, 5, 7, 9), ]
#>    face     suit value
#> 26  ace    clubs     1
#> 44 nine   hearts     9
#> 29 jack diamonds    11
#> 42 jack   hearts    11
#> 22 five    clubs     5

e per il secondo:

deck_shuffled[c(2, 4, 6, 8, 10), ]
#>     face     suit value
#> 24 three    clubs     3
#> 47   six   hearts     6
#> 34   six diamonds     6
#> 51   two   hearts     2
#> 17   ten    clubs    10