@chanceprotocol/uniform-random-number
v0.1.0
Published
PoolManager Lossless Pool Smart Contracts
Downloads
4
Readme
Uniform Random Number
This Solidity library eliminates modulo 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 | | ---------| --------- | | 0 | 0 | | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4 | 0 | | 5 | 1 |
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": {
"@chanceprotocol/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.