Estoy de acuerdo con @encor en que no es un problema incluir algo de lógica para evitar errores. Me imagino que la mayoría de los generadores de números aleatorios no uniformes ya lo incluyen.
Creo que no he utilizado un generador de números pseudoaleatorios que reciba un 0. No soy un experto en el tema, pero una implementación común (generador congruente lineal) se basa en la aritmética modular. Por ejemplo, el generador X_{n+1}=f(X_{n})mod\: m puede producir números entre 0 y m-1 donde m es un número grande. A continuación, se puede dividir por m y asegúrese de que todos los números están entre 0 y 1. La única forma de obtener un cero es si f(X_{n}) es igual a m . Si m es lo suficientemente grande (y la mayoría parece estar usando 2^{31} o 2^{32} ), entonces eso debería ser muy raro.
La única otra cosa que se me ocurre es un problema con los tipos. Por ejemplo, podrías necesitar un unsigned int o long para generar los enteros aleatorios. La división para obtener entre 0 y 1 sugiere un tipo float o double. Podría estar redondeando las cosas a 0 en lugar de 0.xxx1.
Si no está satisfecho con lo anterior, existen otras técnicas para el muestreo de distribuciones. Por ejemplo, puede representar la distribución como una rejilla, como en las vistas extremas totalmente flexibles de Meucci (aunque sin la parte de la agrupación de la entropía). A continuación, puede utilizar la interpolación lineal como él describe para simular a partir de la distribución de la cuadrícula.