Traduzindo o código, aparentemente ele diz que o drop só ocorreu quando o .@chance for menor que a minha chance, ou seja, se estou com bc e tenho 12% de chances, o drop só vai ocorrer se o random for menor que 12, ou seja, 1, 2, 3... 12, sequencialmente, correto?
Se for isso, do meu ponto de vista, o código não está errado, mas se eu fosse apostar em uma rifa de 100 números e comprasse 12 números, nunca colocaria em sequência. Uma sugestão que talvez possa ajudar a melhorar seria a seguinte:
1º: a chance poderia ser um array com números gerados aleatoriamente, se tenho 3%, 3 números, se 6%, 6 números, se 12%, 12 números.
Ex: 3% = [rand(1, 100), rand(1, 100), rand(1, 100)]
2º: a validação deveria ocorrer gerando 1 número aleatório de 1 a 100 e se esse número corresponder a algum dentro do meu array, então dropou, senão, não