647 votos

La generación de Números Aleatorios en Objective-C

Soy programador de Java principalmente, y quiero una forma de generar un número pseudoaleatorio entre 0 y 74. En java utilizaría el método:

Random.nextInt(74)

No estoy interesado en una discusión acerca de las semillas o de la verdadera aleatoriedad, sólo la forma de realizar la misma tarea en Objective-C. he buscado en Google, y que sólo parece haber un montón de información diferente y contradictoria.

921voto

lajos Puntos 13791

Usted debe utilizar la función arc4random(). Se utiliza un algoritmo superior de rand. Usted ni siquiera necesita establecer una semilla.

#include 
...
...
int r = arc4random() % 74;

La página de arc4random:

NAME
     arc4random, arc4random_stir, arc4random_addrandom -- arc4 random number generator

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include 

     u_int32_t
     arc4random(void);

     void
     arc4random_stir(void);

     void
     arc4random_addrandom(unsigned char *dat, int datlen);

DESCRIPTION
     The arc4random() function uses the key stream generator employed by the arc4 cipher, which uses 8*8 8
     bit S-Boxes.  The S-Boxes can be in about (2**1700) states.  The arc4random() function returns pseudo-
     random numbers in the range of 0 to (2**32)-1, and therefore has twice the range of rand(3) and
     random(3).

     The arc4random_stir() function reads data from /dev/urandom and uses it to permute the S-Boxes via
     arc4random_addrandom().

     There is no need to call arc4random_stir() before using arc4random(), since arc4random() automatically
     initializes itself.

EXAMPLES
     The following produces a drop-in replacement for the traditional rand() and random() functions using
     arc4random():

           #define foo4random() (arc4random() % ((unsigned)RAND_MAX + 1))

382voto

yood Puntos 3642

Utiliza la función arc4random_uniform(limite_superior) para generar un número aleatorio dentro de un rango. El siguiente código va a generar un número entre 0 y 73 inclusive.

arc4random_uniform(74)

arc4random_uniform(upper_bound) evita modulo bias , como se describe en la página del manual:

arc4random_uniform() devolverá un número aleatorio distribuido uniformemente menor que upper_bound. arc4random_uniform() se recomienda sobre construcciones, como `arc4random() % upper_bound" ya que evitan el "modulo bias" cuando el límite superior no es una potencia de dos.

41voto

Tibidabo Puntos 10510

Esto le dará un punto flotante número entre 0 y 47

float low_bound = 0;      
float high_bound = 47;
float rndValue = (((float)arc4random()/0x100000000)*(high_bound-low_bound)+low_bound);

O simplemente

float rndValue = (((float)arc4random()/0x100000000)*47);

Tanto el límite inferior y superior puede ser negativa también. El ejemplo de código siguiente se le da un número aleatorio entre-35.76 y +12.09

float low_bound = -35.76;      
float high_bound = 12.09;
float rndValue = (((float)arc4random()/0x100000000)*(high_bound-low_bound)+low_bound);

Convertir el resultado a un terreno Entero valor:

int intRndValue = (int)(rndValue + 0.5);

32voto

Michael Buckley Puntos 2856

Según la página de manual de rand(3), la rand familia de funciones han quedado obsoletas por azar(3). Esto es debido al hecho de que el menor de 12 bits de rand() pase a través de un patrón cíclico. Para obtener un número al azar, sólo la semilla del generador llamando srandom() con un entero de las semillas, y luego de la llamada random(). Así, el equivalente del código anterior sería

#import <stdlib.h>
#import <time.h>

srandom(time(NULL));
random() % 74;

Usted sólo necesita llamar a srandom() una vez en el programa a menos que desee cambiar su semilla. A pesar de que dijo que no quería una discusión de la verdad de valores aleatorios, rand() es una muy mala generador de números aleatorios, y aleatorio() todavía sufre de modulo de sesgo, ya que generará un número entre 0 y RAND_MAX. Así, por ejemplo. si RAND_MAX es de 3, y se desea un número aleatorio entre 0 y 2, que está el doble de probabilidades de obtener un 0 de un 1 o un 2.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X