Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 1x 8x 8x 30x 20x | import { Fraction } from "./Fraction"; import { WithOdds } from "./WithOdds"; /** * A device generating random outcomes with specific odds. For example, a * classic 6-sided can be created with the following code: * * ```javascript * const d6 = new RandomDevice<number>([ * [1, new Fraction(1, 6)], * [2, new Fraction(1, 6)], * [3, new Fraction(1, 6)], * [4, new Fraction(1, 6)], * [5, new Fraction(1, 6)], * [6, new Fraction(1, 6)] * ]); * ``` * * @param Outcome * The type of the outcome generated from this random device. */ export class RandomDevice<Outcome> { /** The sets and associated odds this random device generates. */ private _outcomesWithOdds: WithOdds<Outcome[]>[] = []; /** * Constructor for a random device. * * @param {ReadonlyArray<[Outcome, Fraction]>} outcomesWithOdds * An array of (outcome, odds) pairs. */ constructor(outcomesWithOdds: ReadonlyArray<[Outcome, Fraction]>) { for (const elem of outcomesWithOdds) { this._outcomesWithOdds.push({ oddsOfValue: elem[1], value: [elem[0]], }); } } /** * Get the possible outcomes and odds for this random device. * * @returns {SetWithOdds<Outcome>[]} * The possible outcomes (as sets) this random device can generate along * with the odds of each outcome. */ public getOutcomesWithOdds(): WithOdds<Outcome[]>[] { return this._outcomesWithOdds; } } |