Ignore the suit of the cards. So you can draw a 1 (Ace) through 13 (King). Pulling two cards is a range of 2 to 26. Divide by 2 and add 1 means you get the same roll distribution as rolling two dice.
That’s not the same roll distribution as rolling two dice[1]. For instance, rolling a 14 (pulling 2 kings) has a probability of 4∗352∗51≈0.0045249, not 17∗7≈0.020408[2].
(The actual distribution is weird. It’s not even symmetrical, due to the division (and associated floor). Rounding to even/odd would help this, but would cause other issues.)
This also supposes you shuffle every draw. If you don’t, things get worse (e.g. you can’t ‘roll’ a 14 at all if at least 3 kings have already been drawn).
====
Fundamentally: you’re pulling out 2 cards from the deck. There are 52 possible choices for the first card, and 51 for the second card. This means that you have 52*51 possibilities. Without rejection sampling this means that you’re necessarily limited to probabilities that are a multiple of 152∗51. Meanwhile, rolling N S-sided dice and getting exactly e.g. N occurs with a probability of 1NS. As N and S are both integers, and 52=2*2*13, and 51=3*17, the only combinations of dice you can handle without rejection sampling are:
...and even then many of these don’t actually involve both cards. For instance, to get 2d2 with 2 pulled cards ignore the second card and just look at the suit of the first card.
Alice and Bob won’t always cheat because they will get good rolls sometimes that will look like cheats but won’t be.
Wait, do you mean:
Decide to cheat or not cheat, then if not cheating do a random roll, or
Do a random roll, and then decide to cheat or not?
I was assuming 1, but your argument is more suited for 2...
import itertools
import fractions
import collections
cards = list(range(1, 14))*4
dice_results = collections.Counter(a+b for a in range(1, 8) for b in range(1, 8))
dice_denom = sum(dice_results.values())
card_results = collections.Counter((a+b)//2+1 for a, b in itertools.permutations(cards, r=2))
card_denom = sum(card_results.values())
for val in range(2, 15):
print(val, fractions.Fraction(card_results[val], card_denom), fractions.Fraction(dice_results[val], dice_denom), sep='\t')
[edited]
That’s not the same roll distribution as rolling two dice[1]. For instance, rolling a 14 (pulling 2 kings) has a probability of 4∗352∗51≈0.0045249, not 17∗7≈0.020408[2].
(The actual distribution is weird. It’s not even symmetrical, due to the division (and associated floor). Rounding to even/odd would help this, but would cause other issues.)
This also supposes you shuffle every draw. If you don’t, things get worse (e.g. you can’t ‘roll’ a 14 at all if at least 3 kings have already been drawn).
====
Fundamentally: you’re pulling out 2 cards from the deck. There are 52 possible choices for the first card, and 51 for the second card. This means that you have 52*51 possibilities. Without rejection sampling this means that you’re necessarily limited to probabilities that are a multiple of 152∗51. Meanwhile, rolling N S-sided dice and getting exactly e.g. N occurs with a probability of 1NS. As N and S are both integers, and 52=2*2*13, and 51=3*17, the only combinations of dice you can handle without rejection sampling are:
Nd1[3]
1d2, 1d3, 1d4, 1d13, 1d17, 1d26, …, 1d(52*51)
2d2
...and even then many of these don’t actually involve both cards. For instance, to get 2d2 with 2 pulled cards ignore the second card and just look at the suit of the first card.
Wait, do you mean:
Decide to cheat or not cheat, then if not cheating do a random roll, or
Do a random roll, and then decide to cheat or not?
I was assuming 1, but your argument is more suited for 2...
Aside from rolling a strange combination of a strangely-labelled d52 and a strangely-labelled d51, or somesuch.
This is somewhat trivial, but I figured it was worth mentioning.