Mjo, men problemet är att även när du hittar dubletter så byter du ju bara ut dem mot ett nytt slumpmässigt tal, som kan i sig vara en dublett med vilket annat tal som helst, så du måste loopa över loopen som byter nummer så länge som du bytt ett nummer. Enklare är att bara hålla reda på vilka tal som redan är använda, och slumpa om tills du får ett som inte är använt.
I mitt förslag lagras "använt eller inte" som bittar.
Ett annat alternativ är att göra en array av de 25 talen, och sedan plocka slumpmässiga tal ur arrayen (sätt sedan de nuffrorna till 'used', t.ex. 0). Det här är rätt likt hur det fungerar i verkligheten, även om det är mer likt alternativ 3: Ordna arrayen med nufforna slumpmässigt, och plocka de åtta första (bevisligen samma effekt som att plocka 8 slumpmässiga bollar, men garanterat O(n), alternativ som sätter tal till 'used' på ett eller annat sätt har en teoretiskt worst-case O(infinity), om slumpgeneratorn producerar samma tal hela tiden)
Att ordna om en array slumpmässigt är dock i sig ett intressant problem.
Nå.
Tja, mer att lagra talen mer effektivt. För O(n) "normal" case så är metoden jag föreslår OK, även om den strikt talat inte är O(n), ju fler nummer (n) man väljer ut settet möjliga tal (1..25 i ditt fall) desto större är chansen att man får dubletter, så den inre do-while loopen får köra fler gånger.
T.ex, om n>25 kommer man hamna i en oändlig loop eftersom alla tal är använda.
O(whatver) innehär att algoritmen typiskt tar i genomsnitt "whatever" tid, normalt sätt uttryckt i 'n', där n är antalet element/punkter/prylar man opererar på.
https://en.wikipedia.org/wiki/Big_O_notation