OpenTally/docs/rng.md

877 B

Deterministic random number generator specification

The deterministic random number generator used in OpenTally is based on an algorithm by Ronald L Rivest.

The algorithm takes a seed value, which is an arbitrary character string. The algorithm has, in its internal state, a counter, whose value is initially 0.

In order to generate a value between 0 (inclusive) and n (exclusive), to the state is appended a comma (",") followed by the value of the counter, and a SHA-256 hash H is computed of the resulting string encoded using UTF-8. The hash H is represented as an unsigned hexadecimal integer, k. The counter is incremented by 1.

In order to avoid modulo bias, if k ≥ ⌊M/n⌋ × n (where M = 2^256), k is discarded and the algorithm is repeated.

Otherwise, the result is k modulo n.