La tecnica più usata è (la scrivo direttamente, quindi potrebbe contenere errori):
dim MaxNum as Int = 90
dim arrDisponibili(MaxNum + 1) as Int
dim NumDisp as int
dim Buffer as int
For N = 1 to MaxNum
arrDisponibili(N) = N
next
Sub Estrazione
NumDisp = MaxNum
dim x as int
For I = 0 to NumDiLbls - 1 ' numero di estratti sarebbe meglio
x = Rnd(1, NumDisp + 1)
lblNum(I).text = arrDisponibili(x)
' Swap - scambio tra l'ultimo disponibile e quello estratto
Buffer = arrDisponibili(x)
arrDisponibili(x) = arrDisponibili(NumDisp)
arrDisponibili(NumDisp) = Buffer
NumDisp = NumDisp - 1
Next
End Sub
ops, stavo scrivendo mentre AlpVir aveva già postato
Se per caso non funzionasse bene, è per via dei +1, della base 0 dell'array, etc. CONTROLLA!!!
Cmq, la "strategia" sta nell'avere una array (ma puoi usare anche una List ordinata!) con tutti i valori disponibili, randomizzare un INDICE tra 1 e 90 (in questo caso), prelevare il valore dall'array per quel dato indice (che è l'ESTRATTO), scambiare di posto l'ultimo elemento dell'array con quello che corrisponde all'indice (usando un buffer per lo scambio) e "dire" alla routine che adesso i valori disponibili sono ogni volta uno in meno, in modo che gli ultimi della lista non vengano estratti di nuovo)