Version 0 of Random Integers

Updated 2018-05-31 14:27:56 by CecilWesterhof

Created by CecilWesterhof.

Functions to Get Random Integers on a *NIX System

To get better random integers you can use /dev/random and /dev/urandom. They are mostly the same, the difference is that urandom will not block, but that could sacrifice the randomness.

The first proc is a proc to get a a random number. It gives a number in the range 0, 2 ** 32 - 1 (default), or in the range 0, 2 ** 64 - 1 when longVersion is true. Default it uses /dev/urandom, but when the randomness is important (encryption, passwords, …) use secure with True and it will use /dev/random.

proc getRandomIntNix {{secure False} {longVersion False}} {
    if ${secure} {
        set randFile /dev/random
    } else {
        set randFile /dev/urandom
    }
    if ${longVersion} {
        set bytes  8
        set format wu
    } else {
        set bytes  4
        set format iu
    }
    set    randDev [open ${randFile} rb]
    set    random  [read ${randDev}  ${bytes}]
    close  ${randDev}
    binary scan ${random} ${format} randomI
    return ${randomI}
}

Often you need another range (for example -5, 12), for this I created the following proc.

proc getRandomIntInRangeNix {min max {secure False} {longVersion False}} {
    if {${max} < ${min}} {
        error "Error: [info level 0] min max ?secure ?longVersion??"
    }
    if ${longVersion} {
        set maxMod [expr 2 ** 64]
    } else {
        set maxMod [expr 2 ** 32]
    }
    set  modulo [expr {${max} - ${min} + 1}]
    if {${modulo} > ${maxMod}} {
        error "Modulo should be <= ${maxMod} (${modulo})"
    }
    set  random [getRandomIntNix ${secure} ${longVersion}]
    expr {${random} % ${modulo} + ${min}}
}

As always: comments, tips and questions are appreciated.