承接 frank-houweling/weighted-random 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

frank-houweling/weighted-random

Composer 安装命令:

composer require frank-houweling/weighted-random

包简介

Library for generating a weighted random sample

README 文档

README

Build Status codecov

This library is used to pick random values from a set of registered values, where values with a higher weight have a larger probability to be picked.

Installing

Install this library using composer.

composer require frank-houweling/weighted-random

Getting started

Using this library is simple. Initiate the WeightedRandomGenerator, register the possible values, and start generating random values!

<?php
use FrankHouweling\WeightedRandom\WeightedRandomGenerator;

// Initiate the generator
$generator = new WeightedRandomGenerator();

// Register some value
$generator->registerValue('foobar', 5);

// And get a random value
echo $generator->generate() . PHP_EOL;

Registering values

You can set one value with its weight using the following method. A higher weight means a higher probability that the value is generated by the random generator.

<?php
use FrankHouweling\WeightedRandom\WeightedRandomGenerator;

// Initiate the generator
$generator = new WeightedRandomGenerator();

// Register a new value
$generator->registerValue('foobar', 5);

// Override the added value with a weight of 1
$generator->registerValue('foobar', 1);

// The weight should be above 0, this call will result in an \InvalidArgumentException
$generator->registerValue('foobar', 0);

You can register multiple values at once with the registerValues() method. This method only accepts strings an integers as values.

The registerValues() methods expects the value to be the key, and the weight to be the value of the passed array.

<?php
use FrankHouweling\WeightedRandom\WeightedRandomGenerator;

$generator = new WeightedRandomGenerator();

// Register multiple values
$generator->registerValues([
    'foo' => 1,
    'bar' => 2,
]);

// Override the bar, foo will stay the same.
$generator->registerValues([
    'bar' => 1,
]);

// This will result in an InvalidArgumentException, 0 is not a correct weight.
$generator->registerValues([
    'bar' => 0,
]);

You can remove a value from the generator with the removeValue method.

<?php
use FrankHouweling\WeightedRandom\WeightedRandomGenerator;

$generator = new WeightedRandomGenerator();
$generator->registerValue('foobar', 2);

$generator->removeValue('foobar');

If you prefer, you can also use the WeightedValue valueobject. You should use the registerWeightedValue and removeWeightedValue methods to register and remove values with these value objects.

<?php
use FrankHouweling\WeightedRandom\WeightedRandomGenerator;
use FrankHouweling\WeightedRandom\WeightedValue;

$generator = new WeightedRandomGenerator();

$weightedValue = new WeightedValue('foobar', 2);
$generator->registerWeightedValue($weightedValue);
$generator->removeWeightedValue($weightedValue);

Retrieving registered values

You can retrieve registered values and their weights from the generator. These are always returns as WeightedValue valueobjects.

<?php
use FrankHouweling\WeightedRandom\WeightedRandomGenerator;

$generator = new WeightedRandomGenerator();
$generator->registerValues([
    'foo' => 2,
    'bar' => 3,
]);

// Retrieve all registered values
foreach ($generator->getWeightedValues() as $weightedValue) {
    echo sprintf(
        '%s => %s',
        $weightedValue->getValue(),
        $weightedValue->getWeight()
    ) . PHP_EOL;
}

// Or only one, by the given value.
$weightedValue = $generator->getWeightedValue('foo');
echo $weightedValue->getWeight() . PHP_EOL;

Generating a random sample

To generate a random sample from the registered values, we use the generate method.

Generated values are not always unique. It is possible that calling the generate method twice will return in the same value twice.

<?php
use FrankHouweling\WeightedRandom\WeightedRandomGenerator;

$generator = new WeightedRandomGenerator();
$generator->registerValue('foo', 2);

// Because we only registered one value, this now always returns `foobar`
echo $generator->generate() . PHP_EOL;

$generator->registerValue('bar', 2);

// Because we have registered two values, both with a weight of 2, the chance of foo and bar is both 50%.
echo $generator->generate() . PHP_EOL;

You can also generate a sample of multiple values using the generateMultiple method, and a set of multiple values without a possibility of duplicates with generateMultipleWithoutDuplicates.

<?php
use FrankHouweling\WeightedRandom\WeightedRandomGenerator;

$generator = new WeightedRandomGenerator();
$generator->registerValues([
    'foo' => 2,
    'bar' => 2,
]);

// Can return foo + bar, bar + foo, foo + foo or bar + bar.
foreach ($generator->generateMultiple(2) as $value) {
    echo $value . PHP_EOL;
}

// Can return foo + bar or bar + foo
foreach ($generator->generateMultipleWithoutDuplicates(2) as $value) {
    echo $value . PHP_EOL;
}

// This will return three values, of which 2 or 3 are duplicate.
$generator->generateMultiple(3);

// This will throw an \InvalidArgumentException, because it is not possible to generate three unique values.
$generator->generateMultipleWithoutDuplicates(3);

frank-houweling/weighted-random 适用场景与选型建议

frank-houweling/weighted-random 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.29k 次下载、GitHub Stars 达 2, 最近一次更新时间为 2019 年 07 月 27 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「php」 「random」 「weighted」 「sampling」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 frank-houweling/weighted-random 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 frank-houweling/weighted-random 我们能提供哪些服务?
定制开发 / 二次开发

基于 frank-houweling/weighted-random 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 2.29k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 3
  • 点击次数: 28
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 2
  • Watchers: 1
  • Forks: 5
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2019-07-27