Posted to tcl by sebres at Fri Dec 13 14:43:08 GMT 2019view pretty
apply {{} { set max 4 array set weights {0 1 1 0 2 5 3 9 4 7} set n 0; while {$n <= $max} { set rtmw($n) 0; incr n } proc genrnd {} { upvar max max weights weights rtmw rtmw while 1 { set n [expr { int(rand() * ($max+1)) }] if { $weights($n) && [incr rtmw($n)] >= 10-$weights($n) } { set rtmw($n) 0 break } } return $n } timerate { incr num([genrnd]) } 1000 puts [lsort -integer -stride 2 -index 1 -decr [array get num]] }} # results: 3 261842 4 87174 2 52208 0 28929