30 lines
552 B
Tcl
30 lines
552 B
Tcl
package require Tcl 8.6
|
|
|
|
oo::class create SofN {
|
|
variable items size count
|
|
constructor {n} {
|
|
set size $n
|
|
}
|
|
method item {item} {
|
|
if {[incr count] <= $size} {
|
|
lappend items $item
|
|
} elseif {rand()*$count < $size} {
|
|
lset items [expr {int($size * rand())}] $item
|
|
}
|
|
return $items
|
|
}
|
|
}
|
|
|
|
# Test code
|
|
for {set i 0} {$i < 100000} {incr i} {
|
|
set sOf3 [SofN new 3]
|
|
foreach digit {0 1 2 3 4 5 6 7 8 9} {
|
|
set digs [$sOf3 item $digit]
|
|
}
|
|
$sOf3 destroy
|
|
foreach digit $digs {
|
|
incr freq($digit)
|
|
}
|
|
}
|
|
parray freq
|