Générateur de nombres pseudo-aléatoires de George Marsaglia
source :
http://wiki.tcl.tk/19710
Pour les cas où la fonction
rand n'est pas assez aléatoire à votre goût...
Variables à déclarer
variable randgen_mod [expr {wide(256)*wide(256)*wide(256)*wide(256)-5}]
variable randgen_fac [expr {wide(256)*wide(32)}]
variable randgen_x1 [expr {wide($::randgen_mod*rand())}]
variable randgen_x2 [expr {wide($::randgen_mod*rand())}]
variable randgen_x3 [expr {wide($::randgen_mod*rand())}]
Procédure
proc randgen {factor offset} {
variable randgen_mod; variable randgen_fac; variable randgen_x1; variable randgen_x2; variable randgen_x3
set xn [expr {($randgen_fac * ($randgen_x3 + $randgen_x2 + $randgen_x1)) % $randgen_mod}]
set randgen_x1 $randgen_x2
set randgen_x2 $randgen_x3
set randgen_x3 $xn
return [expr {int(($xn / double($randgen_mod) * $factor) + $offset)}]
}