战斗喧嚣/shuffle-bag

此包已被放弃,不再维护。未建议替代包。

更好的随机分布的洗牌袋

v1.0-beta 2013-04-20 09:29 UTC

This package is not auto-updated.

Last update: 2020-08-16 15:48:41 UTC


README

构建状态: Build Status

Scrutinizer: Scrutinizer Quality Score

Packagist: Latest Stable Version

这是一个洗牌袋实现,高度灵感来源于这篇文章及其C#示例。

什么是洗牌袋?

洗牌袋可用于随机选择物品,在最多进行X次选择后达到目标分布,其中X表示所有物品被添加的数量总和。

洗牌袋可以用于游戏,以在保持游戏平衡的同时提供一定程度的随机性。

安装

安装此库最简单的方法是使用Composer。将包 "battlerattle/shuffle-bag" 添加到您的 composer.json 中

{
    "require": {
        "battlerattle/shuffle-bag": "v1.0-beta"
    }
}

示例

假设您希望以10%、30%和60%的概率选择3个不同的物品。将这些物品添加到您的袋子中1次、3次和6次,并在10次选择后,您将得到目标分布。添加这些物品10次、30次和60次,以获得更好的随机性,因为您可能随机连续10次选择到第一个物品,但在最多100次选择后,您将再次达到目标分布。

使用

我们在这里实现了上述示例

use BattleRattle\ShuffleBag\ArrayShuffleBag;

$bag = new ArrayShuffleBag();

// add your items with a certain probability
$bag->add('item 1', 1);
$bag->add('item 2', 3);
$bag->add('item 3', 6);

// pick a random item
$item = $bag->next();

为了在多个请求中使用相同的袋子,您需要将袋子存储在持久存储中。这里我们使用PersistentShuffleBag与Redis(《Predis》)作为存储

use BattleRattle\ShuffleBag\PersistentShuffleBag;
use BattleRattle\ShuffleBag\Storage\RedisStorage;
use Predis\Client;

$redisClient = new Client();
$storage = new RedisStorage($redisClient);
$bag = new PersistentShuffleBag($storage);

$bag->add('foo', 42);
$bag->add('bar', 1337);

$item = $bag->next();