gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:02:42 25 4
gpt4 key购买 nike

我正在尝试计算 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com