PHPackages                             getsky/random-winner - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. getsky/random-winner

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

getsky/random-winner
====================

Random winner

021PHP

Since Mar 25Pushed 11y ago1 watchersCompare

[ Source](https://github.com/JimmDiGrizli/random-winner)[ Packagist](https://packagist.org/packages/getsky/random-winner)[ RSS](/packages/getsky-random-winner/feed)WikiDiscussions develop Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

RandomWinner
============

[](#randomwinner)

[![Build Status](https://camo.githubusercontent.com/3763498c4f84154439c56a4601be5235f1acdee8c994dd358d6d330b2ece8bd3/68747470733a2f2f7472617669732d63692e6f72672f4a696d6d44694772697a6c692f72616e646f6d2d77696e6e65722e737667)](https://travis-ci.org/JimmDiGrizli/random-winner)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/ffc9a35648c27510d8f520b14d149c4a65659394448c69361b852e666d58baf1/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f4a696d6d44694772697a6c692f72616e646f6d2d77696e6e65722f6261646765732f7175616c6974792d73636f72652e706e673f623d646576656c6f70)](https://scrutinizer-ci.com/g/JimmDiGrizli/random-winner/?branch=develop)[![Code Coverage](https://camo.githubusercontent.com/a46dfbb89eb2461affbb16431aa7bf6e16fac7287c4f2d2582ce53134da0c518/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f4a696d6d44694772697a6c692f72616e646f6d2d77696e6e65722f6261646765732f636f7665726167652e706e673f623d646576656c6f70)](https://scrutinizer-ci.com/g/JimmDiGrizli/random-winner/?branch=develop)

This library can help to easily determine the winner by a random number generator.

Simple Usage
------------

[](#simple-usage)

```
include '../vendor/autoload.php';

use GetSky\RandomWinner\Member;
use GetSky\RandomWinner\Solver;

// First, create an object of class Solver with indication a desired generator.
$solver = new Solver((new RandomLib\Factory)->getMediumStrengthGenerator());

// Then we get a storage and attach members.
$storage = $solver->getStorage();
$storage->attach(new Member('Foo', 35));
$storage->attach(new Member('Bar', 10));
$storage->attach(new Member(new StdClass(), 55));

// Now we can determine the winner.
$winner = $solver->run();
$winner = $solver->run();
```

Member Interface
----------------

[](#member-interface)

You can pass as a member any object that implements MemberInterface.

```
include '../vendor/autoload.php';

use GetSky\RandomWinner\MemberInterface;
use GetSky\RandomWinner\Solver;

Class MyMember implements MemberInterface {

    public $limit;

    public function __construct($limit)
    {
        $this->limit = $limit;
    }

    public function getChance()
    {
        return rand(0, $this->limit);
    }
}

$solver = new Solver((new RandomLib\Factory)->getMediumStrengthGenerator());

$storage = $solver->getStorage();
$storage->attach(new MyMember(35));
$storage->attach(new MyMember(25));

$winner = $solver->run();
```

MembersStorage Interface
------------------------

[](#membersstorage-interface)

If you need to implement your storage and logic of creating ranges, you can realize your MemberStorage inheriting MemberStorageInterface:

```
class MyMembersStorage implements MembersStorageInterface {

    protected $array = [];
    protected $upperLimit = 0;
    protected $max = 100;

    public function attach(\GetSky\RandomWinner\MemberInterface $member)
    {
        if (!array_search($member, $this->array, true)) {
            $this->array[] = $member;
            $this->upperLimit += $member->getChance();
        }
    }

    public function contains(\GetSky\RandomWinner\MemberInterface $member)
    {
        return (boolean) array_search($member, $this->array, true);
    }

    public function detach(\GetSky\RandomWinner\MemberInterface $member)
    {
        if (array_search($member, $this->array, true)) {
            unset($this->array[array_search($member, $this->array, true)]);
            $this->upperLimit -= $member->getChance();
        }
    }

    public function getRange(\GetSky\RandomWinner\MemberInterface $member)
    {
        return [0, $member->getChance()];
    }

    public function getAll()
    {
        return $this->array;
    }

    public function getUpperLimit()
    {
        if ($this->upperLimit > $this->max) {
            return $this->max;
        }

        return $this->upperLimit;
    }
}
```

```
// Create our members storage.
$storage = new MyMembersStorage();

// Create a member objects with a chance to win and attach them to the storage.
$storage->attach(new Member('Foo', 35));
$storage->attach(new Member('Bar', 10));
$storage->attach(new Member(new StdClass(), 55));

// Prepare library for generating random numbers and our solver.
$solver = new Solver((new RandomLib\Factory)->getMediumStrengthGenerator(), $storage);

// Run solver. You want to run again and again.
$winner = $solver->run();
$winner = $solver->run();
```

MembersStorage Interface
------------------------

[](#membersstorage-interface-1)

You can use static factory for create solver with various members storage.

```
$generator = (new RandomLib\Factory)->getMediumStrengthGenerator();

$solver1 = SolverFactory::createSolver($generator, [['bar',3], ['foo',5]]);
$solver2 = SolverFactory::createSolver($generator, [['example',1], ['example2',5], ['example3',2]]);
// Now we can determine the winner.
$winner1 = $solver1->run();
$winner2 = $solver2->run();
```

```

```

###  Health Score

20

—

LowBetter than 14% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community4

Small or concentrated contributor base

Maturity41

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/6f3317bf3a7622b52216bc897cf6875f60a51c5c95bce653ce0f9dec77ef92d7?d=identicon)[JimmDiGrizli](/maintainers/JimmDiGrizli)

### Embed Badge

![Health badge](/badges/getsky-random-winner/health.svg)

```
[![Health](https://phpackages.com/badges/getsky-random-winner/health.svg)](https://phpackages.com/packages/getsky-random-winner)
```

###  Alternatives

[echo511/plupload

Plupload component for Nette Framework.

104.4k1](/packages/echo511-plupload)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
