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
Respuesta
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.
Gracias. Chris acaba de publicar la respuesta antes que tú, así que lo hice. – avd
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.
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;
}
¡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 –
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
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. –
- 1. Números aleatorios en C
- 2. Generar "en rango" números aleatorios en C
- 3. generar números dobles aleatorios en C++
- 4. ¿Cómo generar una lista de números aleatorios?
- 5. Cómo generar números aleatorios grandes C
- 6. ¿Cómo generar números aleatorios en paralelo?
- 7. factorial de n números usando C# lambda ...?
- 8. Redondeando números a n decimales en clojure
- 9. Cómo generar n hilos?
- 10. Cómo generar números aleatorios erróneos
- 11. Cómo generar manualmente números aleatorios
- 12. Números aleatorios usando C#
- 13. Generar números aleatorios de forma segura en Objective-C
- 14. c - generador de números aleatorios
- 15. Big-O complejidad de c^n + n * (log n)^2 + (10 * n)^c
- 16. ¿Cómo generar diferentes números aleatorios en un bucle en C++?
- 17. Generar números aleatorios criptográficamente seguros en php
- 18. Clasifique N números en orden de dígitos
- 19. ¿Cómo puedo generar números aleatorios en Unqiue C#
- 20. ¿Cómo puedo generar números aleatorios en Python?
- 21. ¿Cómo puedo generar números aleatorios en Dart?
- 22. Elegir n números con suma fija
- 23. Generando Números Aleatorios en Go
- 24. Regex (C#): Reemplace \ n con \ r \ n
- 25. Cómo calcular n log n = c
- 26. Generar 3 números aleatorios que sumen a 1 en R
- 27. Generar números aleatorios con distribución probabilística
- 28. Generar números aleatorios distribuidos por Zipf
- 29. ¿Cómo generar números "aleatorios" pero también "únicos"?
- 30. Cómo generar n-grams en scala?
¿Por qué el voto hacia abajo? Deseo que este sitio obligue a las personas a agregar un comentario cuando voten. –