¿Y cuántos números has de generar? EL enunciado no indica cuál es el objetivo, más allá del tiempo.
A ver, lo ideal para este caso es usar un HashSet, porque a parte de ser el más rápido iterando (recorriendo sus elementos), no acepta valores repetidos. Es decir, automáticamente te va a rechazar números repetidos sin que tengas que hacer nada para asegurarte de que se cumple este punto del enunciado.
Mira, te dejo un código que genera aleatorios hasta conseguir 1 millón de números NO repetidos.
He puesto como objetivo 1 millón porque en mi ordenador (un AMD Ryzen 3700X) los consigue en poco más de 2 segundos, alguna vez lo ha conseguido en 1.97 segundos.
En ordenadores menos potentes puede necesitar más tiempo, así que puedes establecer un objetivo menor e ir aumentándolo poco a poco hasta alcanzar los 2 segundos.
Por placer, he puesto en el programa también un contador de la cantidad de números que son rechazados por el HashSet por estar repetidos.
Este cálculo extra puede hacer aumentar algunos milisegundos el tiempo necesario para completar el proceso, así que lo puedes quitar si quieres. Pero vamos, el impacto es muy bajo.
EDITO:
Uooo, nuevo record