1.0.0-beta.1 • Published 3 years ago

@dtribe/uniform-random-number v1.0.0-beta.1

Weekly downloads
-
License
SEE LICENSE IN LI...
Repository
github
Last release
3 years ago

Uniform Random Number

CircleCI

This Solidity library eliminates module bias when using a large number to select from a limited range of numbers.

For example:

  • Assume the max unsigned integer is 5
  • random() selects an integer between 0 and 5

We want to use the random number to select a value between 0 and 3.

selection = random() % 4

The above might do, until we realize that:

random()selection
00
11
22
33
40
51

Notice that 0 and 1 are overrepresented. This is modulo bias, and is problematic when making fair selection algorithms.

This library mitigates modulo bias using an algorithm described in this article.

Installation

Add to your package.json:

{
  "dependencies": {
    "@pooltogether/uniform-random-number": "pooltogether/uniform-random-number#master"
  }
}

Usage

import "pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol";

// ...

uint256 randomNumber = uint256(keccak('Hello'));
uint256 upperLimit = 10;
UniformRandomNumber.uniform(randomNumber, upperLimit);

Audit

This code has been audited by OpenZeppelin and Quantstamp as part of the PoolTogether codebase.