Los números seudoaleatorios se eligen con la misma probabilidad en un conjunto finito de números. Los números elegidos no son completamente aleatorios porque se seleccionan mediante un algoritmo matemático concreto, pero su aleatoriedad es suficiente para fines prácticos. La implementación actual de la clase Random se basa en el algoritmo del generador de números aleatorios sustractivo de Donald E. Knuth. Para obtener más información, consulte el libro "The Art of Computer Programming, volume 2: Seminumerical Algorithms" de D. E. Knuth. Addision-Wesley, Reading, MA, second edition, 1981.
La generación de números aleatorios comienza por un valor de inicialización. Si se utiliza la misma inicialización repetidas veces, se genera la misma serie de números. Una forma de generar secuencias distintas consiste en hacer que el valor de inicialización dependa del tiempo y, por lo tanto, que se genere una serie distinta con cada nueva instancia de Random.
Para mejorar el rendimiento, hay que crear una instancia de Random que genere muchos números aleatorios con el tiempo, en lugar de crear una instancia de Random repetidas veces para generar un único número aleatorio.
Para generar un número aleatorio criptográficamente seguro que pueda utilizarse, por ejemplo, para crear una contraseña segura, hay que utilizar una clase derivada de System.Security.Cryptography.RandomNumberGenerator, como System.Security.Cryptography.RNGCryptoServiceProvider.