why are u runnin your probe script with 2 while loop which count to outerspace?
btw.. its not an iteration, its just a simple statistic nothin more.

sure a while loop need iteration to run, but thats a different story of address calculation.
so how about this one? runnin on a 3num test by 10000 test 44times faster.
Code:
alias probtest {
  var %time = $ticks
  var %max = 3
  var %i = 1
  while (%i <= %max) {
    var %prob_ [ $+ [ %i ] ] 0
    inc %i
  }
  %i = 0
  while (%i < $1) {
    inc %prob_ [ $+ [ $rand(1, %max) ] ]
    inc %i
  }
  echo 12 $1 iterations performed
  echo 12 -----------------------
  %i = 1
  while (%i <= %max) {
    var %nr = %prob_ [ $+ [ %i ] ]
    echo 12 %i $+ : %nr occurences ( $+ $calc(%nr / $1 * 100) percent)
    inc %i
  }
  echo 12 $calc($ticks - %time) $+ ms elapsed.
}   


and i use thisone to generate my random values... the numbers within one span only return once per cycle. i need that type of behaviour more often than a random int which can be the same number several times one after another.

only limitation is the max length of around 900chrs for a string within mirc for the output.

Code:
;
; radom integer
;
;nimmt per zufall eine Zahl aus %start bis %ende, wobei keine Zahl innerhalb
; eines Durchlaufs zwei mal auftaucht. Es dürfen alles nur Integer werte sein!
;
;
;Version: 1.0.2 - 14.06.2002 by Codeq
;Version: 1.0.4 - 15.06.2002 by Codeq
;Version: 2.0.0 - 09.09.2002 by Codeq
;
;
;
;Sytax: $randomint(<start> <ende> [p]<N>)
;wobei N angibt wie viele zahlen zurückgegeben werden sollen. Bei pN ist es ein Prozentwert.
;
;DONT MAKE CHANGES BELOW THIS LINE
;---------------------------------

alias randomint {
  tokenize 32 $1-
  var %randomint.start = $round($1,0)
  var %randomint.ende = $round($2,0)
  if (%randomint.start < %randomint.ende) {
    if (p == $left($3,1)) { var %randomint.prozent = $remove($3,p) }
    else { var %randomint.absolut = $round($3,0) }
    if (%randomint.start <= %randomint.ende) {
      var %randomint.i = 1
      var %randomint.j = $calc($abs($calc((%randomint.ende * -1) + %randomint.start)) + 1)
      if (%randomint.prozent) { var %randomint.absolut = $round($calc(($remove($3,p) * %randomint.j) / 100),0) }
      if (%randomint.absolut > 0) {
        var %randomint.string 
        var %randomint.output 
        while (%randomint.i <= %randomint.j) {
          var %randomint.string $addtok(%randomint.string,$calc(%randomint.start + %randomint.i - 1),44)
          inc %randomint.i
        }
        while (%randomint.absolut > 0) {
          var %randomint.rand = $rand(1,$numtok(%randomint.string,44))
          var %randomint.output = $addtok(%randomint.output,$gettok(%randomint.string,%randomint.rand,44),44)
          var %randomint.string = $deltok(%randomint.string,%randomint.rand,44)
          dec %randomint.absolut
        }
        return %randomint.output
      }
      else { return *** error: ausgabe muss grösser null sein. }
    }
  }
  else { return *** error: start muss kleiner ende sein. }
}