ipapikas/dice

Dice 允许您从给定的概率集中选择一个选项。

v1.0.1 2018-01-14 12:21 UTC

This package is auto-updated.

Last update: 2024-09-04 19:55:51 UTC


README

Dice 允许您从给定的概率集中选择一个选项。

StyleCI Latest Stable Version Total Downloads License

简介

Dice 是一个基本的库,它提供了一个用于模拟掷骰子的随机处理器。换句话说,它允许您从一组具有指定概率的选项中选择一个。

Dice 提供了一套分布和随机化工具,允许您进行选择。您可以选择具有相等概率的分布(骰子、硬币等),或者根据需要构建可能不具有相同概率的分布。

Dice 目前处于 beta 版本,我们正在进行扩展测试和用例,以验证其使用并创建一个稳定版本。

安装

您可以通过将文件添加到您的项目或使用 composer 来简单地安装 Dice。

通过 composer

将以下行添加到您的 composer.json 文件中

"ipapikas/dice": "^1.0"

滚筒

Dice 包含一个主要的滚筒,它接收一个分布和一个随机化器,并选择给定分布的下一个值。

示例

use \Dice\Distributions\CoinDistribution;
use \Dice\Random\MTRand;
use \Dice\Roller;

// Create new Distribution
$coin = new CoinDistribution();

// Create a new Randomizer
$randomizer = new MTRand();

// Create new Roller
$roller = new Roller($coin, $randomizer);

// "Roll" the Dice and get the next item from the distribution
// In this example, the value can be either 1 (Head) or 2 (Tail),
// based on the Distribution
$value = $roller->roll();

工作原理

滚筒包含库的主要逻辑。滚筒是负责获取分布的下一个值并确保有足够逻辑来从一组值中选择的主要处理器。

滚筒的工作是获取所有可能的值并将它们扩展到一个有 100(或 1000 或更多)颗鹅卵石的世界。基于概率分布,滚筒选择一定数量的鹅卵石,并用分布的值给它们上色。基于概率,它选择正确的鹅卵石数量,以便允许分布具有偏差或无偏差。扩展完成后,它使用随机化器从 1 到 100(或 1000 或更多)中选择一颗鹅卵石。由于鹅卵石的数量远远多于分布中的值,我们可以确保它不会做出任何偏差决策或遗漏任何东西。

鹅卵石

鹅卵石的数量基于所需的精确程度。

如果概率各为 50%,则 10 颗鹅卵石足够选择一个介于 1 和 10 之间的数字,并确定哪些鹅卵石是哪个值。

如果概率低至 1.5%,鹅卵石的数量将为 1000,以允许至少 15 颗鹅卵石看到 1.5%。

请注意

根据上述描述,鹅卵石的数量由精确程度决定。

使用 ProbabilityValidator 构建您的分布至关重要,以确保您的概率总和为 1。否则,滚筒将无法正确选择您的值,并会遗漏一些情况(鹅卵石)。

例如,如果您有以下概率

  • 10%
  • 15%
  • 25%
  • 30%
  • 10%
  • 15%

上述总和为 105%(或 1.05)。鹅卵石的数量将设置为 100,留下 5 颗鹅卵石给最后一个概率,该概率将限制为以下

  • 10%
  • 15%
  • 25%
  • 30%
  • 10%
  • 10%

或者在某些情况下,一个值可能从鹅卵石池中被移除,因为它完全超过了 1。例如

  • 10%
  • 15%
  • 25%
  • 30%
  • 20%
  • 10% -> 此概率将被完全排除

分发

您可以轻松创建自己的分布来满足您的需求。您需要做的就是设置您的验证器(如果有)。

在您的代码中,您可以基于自己的逻辑将自定义项目设置为动态值。

示例

use Dice\Distributions\AbstractDistribution;
use Dice\Validators\ProbabilityValidator;
use Dice\Validators\UnBiasedValidator;

/**
 * Class WeatherDistribution
 */
class WeatherDistribution extends AbstractDistribution
{
    const SUNNY = 1;
    const RAIN = 2;
    const CLOUDY = 3;
    const SNOW = 4;

    /**
     * WeatherDistribution constructor.
     */
    public function __construct()
    {
        // Set validators
        $this->setValidators([
            new ProbabilityValidator(),
            new UnBiasedValidator(),
        ]);
    }

    /**
     * @return mixed
     */
    public function getItems()
    {
        return [
            self::SUNNY => 1 / 4,
            self::RAIN => 1 / 4,
            self::CLOUDY => 1 / 4,
            self::SNOW => 1 / 4,
        ];
    }
}

如果您正在开发游戏,您可以构建上述分布来决定每天的天气情况。

或者,您可以设置分布具有偏差,使得天气比平时更下雨(下雨概率为66%,其他天气的概率为11%)

use Dice\Distributions\AbstractDistribution;
use Dice\Validators\ProbabilityValidator;

/**
 * Class RainyWeatherDistribution
 */
class RainyWeatherDistribution extends AbstractDistribution
{
    const SUNNY = 1;
    const RAIN = 2;
    const CLOUDY = 3;
    const SNOW = 4;

    /**
     * RainyWeatherDistribution constructor.
     */
    public function __construct()
    {
        // Set validators
        $this->setValidators([
            new ProbabilityValidator(),
        ]);
    }

    /**
     * @return mixed
     */
    public function getItems()
    {
        return [
            self::SUNNY => 1 / 9,
            self::RAIN => 2 / 3,
            self::CLOUDY => 1 / 9,
            self::SNOW => 1 / 9,
        ];
    }
}