For several purposes (i.e. creating safe passphrases, cookies etc.) I´m using the rand function of TCL quite often.
But for peace of mind I had to prove two aspects of the random numbers:
* Will the random numbers be evenly distributed or will they follow a bell-shaped curve?
* Will rand return numbers less than 1 typically?
Indeed I made a (very short) attempt to have a look at the source code and quickly decided to follow an empiric approach. Instead of opening a new post I will add my 2 cents to this old thread.
Here is the iRule code returning i.e. 10,000 random numbers over a range of 0-20 upon request. A table is used to count the hits for each number in range.
when HTTP_REQUEST {
remove existing table
table delete -subtable randomtest -all
find x random values in range of 0-y
set x 10000
set y 20
for {set i 0} {${i} < ${x}} {incr i} {
table incr -subtable randomtest key[format %03d [expr {int(rand()*${y})}]]
}
build output and prove number of results
set j 0
set page ""
for {set i 0} {${i} <= ${y}} {incr i} {
if { [table lookup -subtable randomtest key[format %03d ${i}]] ne "" } {
incr j [table lookup -subtable randomtest key[format %03d ${i}]]
}
append page "key[format %03d $i]: [table lookup -subtable randomtest key[format %03d $i]]\r\n"
}
append page "calculations: $j\r\n"
return results
HTTP::respond 200 content ${page} Connection Close Content-Type "text/plain; charset=us-ascii"
return
}
The iRule will be bound to a virtual server having an http-profile.
Send a request via browser or cURL as shown below.
A table is used to count the hits for each number in range.
The result shows an even distribution.
The number 20 (representing a random value of 1) doesnt show up.
$ curl http://10.1.1.61/
key000: 537
key001: 557
key002: 464
key003: 518
key004: 487
key005: 482
key006: 482
key007: 520
key008: 502
key009: 502
key010: 516
key011: 479
key012: 525
key013: 470
key014: 554
key015: 439
key016: 471
key017: 477
key018: 541
key019: 477
key020:
calculations: 10000
Thanks, Stephan