Probabilità e dadi Fate

I dadi di Fate ⬀ sono semplici dadi a sei facce con due segni +, due segni - e due facce bianche ( + ­ ). Il risultato delle azioni in Fate può dipendere dal lancio contemporaneo di 4 dadi i cui risultati vengono sommati: dopo un tiro potremo avere un risultato da -4 a +4.

Esempio: + ­ + = +1

Facendo il punto, abbiamo:

  • 4 dadi
  • 3 modi per ciascun dado, cioè 3 risultati possibili: -1, 0, +1
  • 9 risultati finali possibili: -4, -3, -2, -1, 0, +1, +2, +3, +4
  • 81 casi totali; 34, cioè 3 risultati per ciascun dado

Le permutazioni con ripetizioni che danno i risultati possibili sono:

Risultato Descrizione Permutazioni
+4 possibile solo con quattro "+1", + + + + cioè un modo ripetuto quattro volte 4!/4! = 1
+3 possibile con tre "+1" e uno "0", + + + ­ o + + ­ + o + ­ + + o ­ + + + , spostando il nullo nelle varie posizioni. 4!/3!1! = 4
+2 due "+1" e due "0"; oppure tre "+1" e un "-1" 4!/2!2! + 4!/3!1! = 6 + 4 = 10
+1 un "+1" e tre "0"; oppure due "+1", un "-1" e un "0" 4!/1!3! + 4!/2!1!1! = 4 + 12 = 16
0 quattro "0"; oppure un "+1", un "-1" e due "0"; oppure due "+1" e due "-1" 4!/4! + 4!/1!1!2! + 4!/2!2! = 1 + 12 + 6 = 19

Ovviamente le soluzioni per i risultati negativi sono simmetriche ai positivi corrispondenti.

Dunque si ottiene la seguente casistica:

Risultato Probabilità Percentuale
-4 1/81 1.23%
-3 4/81 4.94%
-2 10/81 12.35%
-1 16/81 19.75%
0 19/81 23.46%
+1 16/81 19.75%
+2 10/81 12.35%
+3 4/81 4.94%
+4 1/81 1.23%

Sperimentalmente, in Perl:

sim@rame:/tmp$ perl t.pl 1000000
 -4      12394     0.0124
 -3      49100     0.0491
 -2     122794     0.1228
 -1     197992     0.1980
  0     234807     0.2348
  1     197596     0.1976
  2     123408     0.1234
  3      49609     0.0496
  4      12300     0.0123

sim@rame:/tmp$ cat -n t.pl 
     1  #!/usr/bin/perl
     2  use strict;
     3  use warnings;
     4  
     5  my ($NUM) = @ARGV;
     6  my @VALUES = (-1, 0, +1);
     7  my %STATS = ();
     8  $STATS{ r(4) }++ for 1 .. $NUM;
     9  
    10  for my $v (sort { $a <=> $b } keys %STATS) {
    11          printf("%3s %10d %10.4f\n", $v, $STATS{$v}, $STATS{$v} / $NUM);
    12  }
    13  
    14  sub r {
    15          my ($n) = @_;
    16          die "n must be > 0" if $n < 1;
    17          my $tot = 0;
    18          $tot += d() for 1 .. $n;
    19          return $tot;
    20  }
    21  
    22  sub d { $VALUES[ int(rand(scalar(@VALUES))) ]; }

Conclusi i conti si nota una distribuzione interessante, con le code a probabilità decisamente ridotta e i valori centrali (-1, 0, +1) compatti e vicini: uno sbilanciamento del genere non si riesce ad ottenere con un semplice d20 che ha la granularità del 5%.

2016-03-05