Accade quando random sceglie il numero più alto del range (es: dato un un range compreso tra 0 e 40 sceglie 40).
Questo perchè le liste partono da zero e non da 1 (a differenza di len()).
Esempio:

codice:
>>> L = ['a', 'b', 'c']
>>> len(L)
3
...come vedi len ritorna 3, però l'ultimo elemento della lista è alla posizione 2:

codice:
>>> L[2]
'c'
...e non 3:

codice:
>>> L[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
Puoi risolvere sostituendo:

codice:
r1 = carte[random.randint(0, len(carte))]
...con (nota il "-1"):

codice:
r1 = carte[random.randint(0, len(carte) -1)]
...oppure, ancora meglio:

codice:
r1 = carte.pop(random.randint(0, len(carte) -1))
...cosi eviti di cancellare a mano l'elemento utilizzando del().