Soy una cabeza de Java principalmente, y quiero una forma de generar un número pseudoaleatorio entre 0 y 74. En Java usaría el método:
Random.nextInt(74)
No estoy interesado en una discusión sobre semillas o aleatoriedad verdadera, sino cómo se realiza la misma tarea en Objective-C. He buscado en Google, y parece que hay mucha información diferente y conflictiva.
objective-c
random
rustyshelf
fuente
fuente
arc4random_uniform(x)
como se describe a continuación por @yood. También está en stdlib.h (después de OS X 10.7 y iOS 4.3) y ofrece una distribución más uniforme de los números aleatorios. Usoint r = arc4random_uniform(74);
Use la
arc4random_uniform(upper_bound)
función para generar un número aleatorio dentro de un rango. Lo siguiente generará un número entre 0 y 73 inclusive.arc4random_uniform(upper_bound)
evita el sesgo de módulo como se describe en la página del manual:fuente
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_3
si falla la verificación, recurra a otra solución.Igual que C, harías
(suponiendo que quisieras incluir 0 pero excluyendo 74, que es lo que hace tu ejemplo de Java)
Editar: Siéntase libre de sustituir
random()
oarc4random()
porrand()
(que, como otros han señalado, es bastante desagradable).fuente
Pensé que podría agregar un método que utilizo en muchos proyectos.
Si termino usándolo en muchos archivos, generalmente declaro una macro como
P.ej
Nota: solo para iOS 4.3 / OS X v10.7 (Lion) y posterior
fuente
Esto le dará un número de coma flotante entre 0 y 47
O simplemente
Tanto el límite inferior como el superior también pueden ser negativos . El siguiente código de ejemplo le proporciona un número aleatorio entre -35.76 y +12.09
Convierta el resultado en un valor entero más redondo :
fuente
drand48
lugar para puntos flotantes.Según la página del manual de rand (3), la familia de funciones rand ha quedado obsoleta al azar (3). Esto se debe al hecho de que los 12 bits inferiores de rand () pasan por un patrón cíclico. Para obtener un número aleatorio, simplemente siembra el generador llamando a srandom () con una semilla sin signo, y luego llama al azar (). Entonces, el equivalente del código anterior sería
Solo necesitará llamar a srandom () una vez en su programa a menos que quiera cambiar su semilla. Aunque dijiste que no querías una discusión sobre valores verdaderamente aleatorios, rand () es un generador de números aleatorios bastante malo, y random () todavía sufre sesgos de módulo, ya que generará un número entre 0 y RAND_MAX. Entonces, por ejemplo, si RAND_MAX es 3 y desea un número aleatorio entre 0 y 2, tiene el doble de probabilidades de obtener un 0 que un 1 o un 2.
fuente
Mejor usar
arc4random_uniform
. Sin embargo, esto no está disponible por debajo de iOS 4.3. Afortunadamente, iOS vinculará este símbolo en tiempo de ejecución, no en tiempo de compilación (así que no use la directiva de preprocesador #if para verificar si está disponible).La mejor manera de determinar si
arc4random_uniform
está disponible es hacer algo como esto:fuente
Escribí mi propia clase de utilidad de números aleatorios solo para tener algo que funcionara un poco más como Math.random () en Java. Tiene solo dos funciones, y todo está hecho en C.
Archivo de cabecera:
Archivo de implementación:
Es una forma bastante clásica de generar pseudo-randoms. En mi delegado de aplicaciones llamo:
Luego más tarde solo digo:
Tenga en cuenta que este método devuelve un número aleatorio entre 0.0f (inclusive) y 1.0f (exclusivo).
fuente
Ya hay algunas respuestas geniales y articuladas, pero la pregunta pide un número aleatorio entre 0 y 74. Use:
arc4random_uniform(75)
fuente
A partir de iOS 9 y OS X 10.11, puedes usar las nuevas clases de GameplayKit para generar números aleatorios de varias maneras.
Tiene cuatro tipos de fuente para elegir: una fuente aleatoria general (sin nombre, hasta el sistema para elegir lo que hace), lineal congruencial, ARC4 y Mersenne Twister. Estos pueden generar entradas aleatorias, flotadores y bools.
En el nivel más simple, puede generar un número aleatorio a partir de la fuente aleatoria incorporada del sistema de esta manera:
Eso genera un número entre -2,147,483,648 y 2,147,483,647. Si desea un número entre 0 y un límite superior (exclusivo) usaría esto:
GameplayKit tiene algunos constructores convenientes integrados para trabajar con dados. Por ejemplo, puedes tirar un dado de seis lados como este:
Además, puede dar forma a la distribución aleatoria utilizando cosas como
GKShuffledDistribution
.fuente
Genere un número aleatorio entre 0 y 99:
Genere un número aleatorio entre 500 y 1000:
fuente
// El siguiente ejemplo generará un número entre 0 y 73.
Salida:
número aleatorio: 72
número aleatorio paso 2: 52
fuente
Para el desarrollo del juego, use random () para generar randoms. Probablemente al menos 5 veces más rápido que usar arc4random (). El sesgo de módulo no es un problema, especialmente para juegos, cuando se generan randoms usando el rango completo de random (). Asegúrese de sembrar primero. Llame a srandomdev () en AppDelegate. Aquí hay algunas funciones de ayuda:
fuente