战斗喧嚣 / shuffle-bag
此包已被放弃,不再维护。未建议替代包。
更好的随机分布的洗牌袋
v1.0-beta
2013-04-20 09:29 UTC
Suggests
- predis/predis: Allows Redis to be used as storage
This package is not auto-updated.
Last update: 2020-08-16 15:48:41 UTC
README
这是一个洗牌袋实现,高度灵感来源于这篇文章及其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();