distribution - 用 6 面骰子计算赔率分布

标签 distribution probability dice

我正在尝试计算 6 面骰子数量变化的几率分布。例如,3d6 的范围从 3 到 18,如下所示:

3:1, 4:3, 5:6, 6:10, 7:15, 8:21, 9:25, 10:27, 11:27, 12:25, 13:21, 14:15, 15:10, 16:6, 17:3, 18:1

我写了这个php程序来计算它:
function distributionCalc($numberDice,$sides=6) {
for ( $i=0; $i<pow($sides,$numberDice); $i++)
    {
    $sum=0;
    for  ($j=0; $j<$numberDice; $j++)
        { $sum+=(1+(floor($i/pow($sides,$j))) % $sides); }
    $distribution[$sum]++;
    }
return $distribution;
}

内部 $j for 循环使用 floor 和模数函数的魔力来创建一个基数为 6 的计数序列,数字的数量是骰子的数量,因此 3d6 将计数为:
111,112,113,114,115,116,121,122,123,124,125,126,131,etc.

该函数取每个的总和,所以它会读作:3,4,5,6,7,8,4,5,6,7,8,9,5等。它遍历所有 6^3 个可能的结果,并将 1 添加到 $distribution 数组中 3 和 18 之间的相应插槽。非常简单。但是,它只能工作到大约 8d6,然后我得到服务器超时,因为它现在正在执行数十亿次计算。

但我认为没有必要,因为死亡概率遵循甜美的钟形曲线分布。我想知道是否有办法跳过数字运算并直接进入曲线本身。有没有办法做到这一点,例如,80d6(范围:80-480)?可以在不进行 6^80 计算的情况下预测分布吗?

我不是专业的编码员,概率对我来说仍然是新的,所以感谢所有的帮助!

斯蒂芬

最佳答案

在 PERL 中:

#!
my( $DieType, $NumDice, $Loaded ) = @ARGV;

my $subname = "D" . $DieType . ( ( $Loaded eq "Loaded" ) ? "Loaded" : "Normal" );
my $Prob = \&$subname;

my $width = 12;
my $precision = $width - 2;

printf "%5s  %-${width}s \n", "Pip:", "Frequency:"; 
for ( my $j = $NumDice; $j <= $DieType * $NumDice ; $j++ ) {
  printf "%5d  %${width}.${precision}f \n", $j, Frequency( $DieType, $NumDice, $j );
}

sub D6Normal {
  my $retval = 1/6;
}

sub D6Loaded {
  my $retval = 1/6;

  CASE: for ($_[0]) {
    /1/    && do { $retval -= 0.02/6;   last CASE; }; 
    /2..5/ && do { $retval += 0.0025/6; last CASE; }; 
    /6/    && do { $retval += 0.01/6;   last CASE; }; 
  }
  return $retval;
}

sub D8Normal {
  my $retval = 1/8;
}

sub D10Normal {
  my $retval = 1/10;
}

sub D10Loaded {
  my $retval = 1/10;

  CASE: for ($_[0]) {
    /1..8/ && do { last CASE; }; 
    /9/    && do { $retval -= 0.01/10;  last CASE; }; 
    /10/   && do { $retval += 0.01/10;  last CASE; }; 
  }
  return $retval;
}

sub D12Normal {
  my $retval = 1/12;
}

sub D20Normal {
  my $retval = 1/20;
}

sub D32Normal {
  my $retval = 1/32;
}

sub D100Normal {
  my $retval = 1/100;
}

sub Frequency {
  my( $DieType, $NumberofDice, $PipCount ) = @_;

  if ( ( $PipCount > ($DieType * $NumberofDice) ) || ( $PipCount < $NumberofDice ) ) { 
    return 0; 
  }

  if ( ! exists $Freq{$NumberofDice}{$PipCount} ) {
    if ( $NumberofDice > 1 ) {
      for ( my $i = max( 1, $PipCount - $DieType ); $i <= min( $DieType * ($NumberofDice - 1), $PipCount - 1 ); $i++ ) {
        $Freq{$NumberofDice}{$PipCount} += &$Prob( $PipCount - $i ) * Frequency( $DieType, $NumberofDice - 1, $i );
      }
    } else {
      $Freq{$NumberofDice}{$PipCount} = &$Prob( $PipCount );
    }
  }
  return $Freq{$NumberofDice}{$PipCount}; 
}

sub max {
  my $max = shift(@_);
  foreach my $arg (@_) {
    $max = $arg if $max < $arg;
  }
  return $max;
}

sub min {
  my $min = shift(@_);
  foreach my $arg (@_) {
    $min = $arg if $min > $arg;
  }
  return $min;
}

关于distribution - 用 6 面骰子计算赔率分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2684747/

相关文章:

iPhone应用程序分发构建包含一个错误

c - 用1随机填充100X100矩阵的100格

math - 帮助概率方程

javascript - 多次掷骰子,多种结果

JAVA,棋盘游戏。随机骰子数字不是随机的

iOS:Over The Air 分发适用于 iPad 1 (iOS 5) 但不适用于 iPad 3 (iOS 6)

matlab - 在 MATLAB 中测试数据分布是否服从高斯分布

python - 如何在圆形分布中生成随机点

algorithm - 均匀奖品分配

python - 在 Python 中模拟掷骰子?