Ink by Example — Random

Ink by Example: Random

We can access randomness through two builtins — rand and urand. On Linux they typically map to /dev/random and /dev/urandom.

std := load('../vendor/std')
range := std.range
each := std.each
log := std.log


For a random number in the range [0, 1) — including zero but excluding one — we use rand.

choices := [rand(), rand(), rand()]
log(choices)

We can use this to shuffle a list using the Fisher-Yates algorithm.

` an ordered list `
numbers := range(0, 10, 1)

shuffle := list => (
    each(list, (val, i) => (
        pick := floor(rand() * (len(list) - i - 1))
        current := len(list) - 1 - i
        tmp := list.(current)
        list.(current) := list.(pick)
        list.(pick) := tmp
    ))
    list
)
log(shuffle(numbers))

For cryptographically secure randomness, use urand. This uses the most secure random number generation interface your system provides to generate a string of random data.

length := 10
log(urand(10))

$ ink random.ink
{0: 0.83260429, 1: 0.90562506, 2: 0.83247869}
{1: 0, 4: 9, 9: 8, 7: 5, 8: 3, 0: 7, 2: 1, 3: 6, 5: 4, 6: 2}
:IjLv ·ê·Y

Next example: Sorting.