La pregunta (quizá algo infantil pero es que no veo solución) es qué hacer cuando un valor es igual o menor que 0. Dar ranks iniciales muy grandes y sumar y restar poco no es una buena idea porque habrá las probabilidades serán muy parecidas para una palabra que sé y otra que no consigo recordar , y sumarle a todas las palabras el valor necesario para que la palabra que menos valga sea 1 tampoco porque entonces transtoca la proporcionalidad...
Si se fijan en la función que utilizo verán por qué no pueden ser negativos los valores
Código :
public function extract(nums:Array) { var arr:Array = nums; var ln:Number = arr.length; var suma:Number = 0; for (var i:Number=0; i<ln; i++) { suma += arr[i].rank; } var aleat:Number = Math.floor(Math.random()*suma); var ind = 0; for (i=0; i<ln; i++) { ind += arr[i].rank; if (ind>aleat) { arr[i].times++; return arr[i].id; } } }