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