Hearthstone Random Attack Calculator
Examples
Configuration
Statistics
 Probability of killing anything: 50.000%
 Probability of killing Player 2: 0.000%
 Probability of killing all 1 minion for Player 2: 50.000%
 Probability of killing any 2health minion: 50.000%
 Probability of any minion at or less than 1health: 87.500%
 Probability of any minion at or less than 2health: 100.000%
 Probability of all minions at or less than 1health: 87.500%
 Probability of all minions at or less than 2health: 100.000%
Chance of Individual Result
Player 2  #1 (2hp) 

HP  Chance  Σ↑ 

29/30  50.000%  50.00%  28/30  37.500%  87.50%  27/30  12.500%  100.00% 
 HP  Chance  Σ↑ 

Full  12.500%  12.50%  1/2  37.500%  50.00%  Dead  50.000%  100.00% 

Board States
1 attack (2 outcomes)Chance  P2  #1 (2hp) 

50.000%  30→29  2→2  50.000%  30→30  2→1 
 2 attack (3 outcomes)Chance  P2  #1 (2hp) 

50.000%  30→29  2→1  25.000%  30→28  2→2  25.000%  30→30  2→0 
 3 attack (3 outcomes)Chance  P2  #1 (2hp) 

50.000%  30→29  2→0  37.500%  30→28  2→1  12.500%  30→27  2→2 

Algorithm
// turn an array of healths into a decodablestring
// note: we need strings since php arrays are shit
function encode($a) {
return implode(':', $a);
}
// turn an encodedstring into an array of healths
function decode($s) {
return array_map('intval', explode(':', $s));
}
// given a hash of states: encoded(healths) > probability
// return the probability of each possible resulting state
// after applying one random attack to all remaining units
function bomb($states) {
$u = array();
foreach ($states as $enc => $prior) {
$x = decode($enc);
$a = array();
for ($i = 0; $i < count($x); $i++) { // collect indices of living units
if ($x[$i] > 0) {
$a[] = $i;
}
}
foreach ($a as $i) { // apply an attack to each unit
$v = $x; // copy the healths
$v[$i]; // reduce hp by one
$k = encode($v);
$c = array_key_exists($k, $u) ? $u[$k] : 0;
$u[$k] = $c + $prior / count($a); // update probabilities
}
}
return $u;
}
Example
// initial board state
$healths = array(2, 2);
// initial board distribution
// (100% chance we have 2x 2hp units)
$s0 = array(encode(healths) => 1);
[2:2] => 1.00000
// apply one random attack
$s1 = bomb($s0);
[1:2] => 0.50000
[2:1] => 0.50000
// apply another
$s2 = bomb($s1);
[0:2] => 0.25000
[1:1] => 0.50000
[2:0] => 0.25000