Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generating random numbers in Objective-C

I'm a Java head mainly, and I want a way to generate a pseudo-random number between 0 and 74. In Java I would use the method:

Random.nextInt(74) 

I'm not interested in a discussion about seeds or true randomness, just how you accomplish the same task in Objective-C. I've scoured Google, and there just seems to be lots of different and conflicting bits of information.

like image 457
rustyshelf Avatar asked Oct 02 '08 04:10

rustyshelf


People also ask

What is arc4random_uniform?

arc4random_uniform(n) returns a random number between zero and the (parameter minus one). drand48() returns a random Double between 0.0 and 1.0. Note: Both arc4random() and arc4random_uniform() use the type UInt32 instead of the more typical Int. Thus, there is a need for conversion for ease of use.


2 Answers

Use the arc4random_uniform(upper_bound) function to generate a random number within a range. The following will generate a number between 0 and 73 inclusive.

arc4random_uniform(74) 

arc4random_uniform(upper_bound) avoids modulo bias as described in the man page:

arc4random_uniform() will return a uniformly distributed random number less than upper_bound. arc4random_uniform() is recommended over constructions like ``arc4random() % upper_bound'' as it avoids "modulo bias" when the upper bound is not a power of two.

like image 28
yood Avatar answered Sep 25 '22 02:09

yood


You should use the arc4random_uniform() function. It uses a superior algorithm to rand. You don't even need to set a seed.

#include <stdlib.h> // ... // ... int r = arc4random_uniform(74); 

The arc4random man page:

NAME      arc4random, arc4random_stir, arc4random_addrandom -- arc4 random number generator  LIBRARY      Standard C Library (libc, -lc)  SYNOPSIS      #include <stdlib.h>       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)) 
like image 120
lajos Avatar answered Sep 22 '22 02:09

lajos