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 |
|---|---|
| 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.
Add to your package.json:
{
"dependencies": {
"@pooltogether/uniform-random-number": "pooltogether/uniform-random-number#master"
}
}import "pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol";
// ...
uint256 randomNumber = uint256(keccak('Hello'));
uint256 upperLimit = 10;
UniformRandomNumber.uniform(randomNumber, upperLimit);This code has been audited by OpenZeppelin and Quantstamp as part of the PoolTogether codebase.