2009-11-04 21 views
5

Quiero generar números aleatorios de -n a n excluyendo 0. ¿Alguien puede proporcionarme el código en C? Cómo excluir 0?Generar números aleatorios de -n a n en C

+1

¿Por qué el voto hacia abajo? Deseo que este sitio obligue a las personas a agregar un comentario cuando voten. –

Respuesta

9

Una idea podría ser generar un número aleatorio x en el rango [1,2n], inclusive. A continuación, devuelva -(x - n) para x mayor que n, o simplemente devuelva x.

Esto debería funcionar:

int my_random(int n) 
{ 
    const int x = 1 + rand()/(RAND_MAX/(2 * n) + 1); 

    return x > n ? -(x - n) : x; 
} 

Véase el comp.lang.c FAQ para obtener más información sobre cómo utilizar de forma segura rand(); explica el uso anterior.

+0

Gracias. Chris acaba de publicar la respuesta antes que tú, así que lo hice. – avd

3

La cosa más simple que puedo sugerir que hacer es generar un número aleatorio entre 0 y 2n y luego hacer el truco de matemáticas:

result= n - randomNumber 

Aunque 0 podría ser muy poco probable que pueda comprobar que el uso de una Si y rehace la generación de números aleatorios.

1
int random(int N) 
{ 
    int x; 
    do{ 
    x=rand()%(N*2+1)-N; 
    }while(x==0); 
    return x; 
} 

Se elige un número de -N al N, pero mantiene en hacerlo si es 0.

Una alternativa, como se sugiere en los comentarios, genera un número entre -N y N-1 y lo incrementa si es positivo o 0:

int random(int N) 
{ 
    int x;  
    x=rand()%(N*2)-N; 
    if(x>=0) x++; 
    return x; 
} 
+1

¡Un tiempo de espera dependiente de un valor aleatorio podría ejecutarse durante mucho, mucho tiempo! Pero podría deshacerse del tiempo de ejecución no determinista reduciendo el rango del resultado aleatorio en 1, luego convirtiendo artificialmente cualquier resultado 0 en el resultado del límite faltante. No se requiere bucle –

+0

No estoy de acuerdo con su afirmación de que tomaría un "largo, largo tiempo": las probabilidades de que x sea 0 (y por lo tanto, la repetición del ciclo) es 1/(2N + 1), que es bastante pequeño para grandes valores de N. Sin embargo, he incorporado su sugerencia en mi respuesta, que creo que ofrece una mejor solución para este problema en particular, así que gracias :) – Wernsey

+0

Ah ... No dije que "tomaría" una larga tiempo, sino que "podría" tomar un largo tiempo. ¡Hay una diferencia! :) Me disculpo si eso suena descarado. Trabajo en software en tiempo real, donde cualquier cosa que no se puede garantizar absolutamente que termine en algún momento determinista "podría llevar mucho tiempo". Técnicamente hablando, su primera versión es O (?) Y su segunda versión es O (1) (o en el peor, no más compleja que "rand"). Entonces, en términos de determinismo, su segunda versión es una gran mejora. Bien hecho, por cierto. Mi sugerencia de "convertir el 0 en el límite" no hubiera sido tan bonita. –