[iPhone SDK] Random Numbers

Discussion in 'iOS Programming' started by Duke Leto, Jun 29, 2008.

  1. macrumors regular

    Joined:
    Mar 17, 2008
    #1
    Can anyone help me with generation of random numbers in the iPhone SDK?
     
  2. macrumors 603

    Joined:
    Jul 29, 2003
    Location:
    Silicon Valley
    #2
    "Real" random numbers, or pseudo-random sequences?
     
  3. macrumors 65816

    Muncher

    Joined:
    Apr 19, 2007
    Location:
    California
    #3
    If you want a cheap, fast pseudo random number generator, try a linear congruential generator, or a linear feedback shift register. They're good, simple generators, but don't trust them for cryptography :rolleyes:.

    If you want "real" random numbers, you could try the audio input; feed the LSB into a shift register, and you've got a good source of random numbers.

    Then there are also a few websites that feed digits to you online.
     
  4. macrumors 68030

    Catfish_Man

    Joined:
    Sep 13, 2001
    Location:
    Portland, OR
    #4
    Uh, my guess is that all he's looking for is

    Code:
    #include <stdlib.h>
    
    long foo = random();
    
     
  5. thread starter macrumors regular

    Joined:
    Mar 17, 2008
    #5
    Actually I was looking for both encryption and that random function... the random function for a simple RPS game, and random numbers .. for well .. encryption. Encryption is still being a pain though..
     
  6. macrumors regular

    Joined:
    Jun 30, 2006
    #6
    remember that any C code works inside objective-C too.
     
  7. macrumors 6502a

    yeroen

    Joined:
    Mar 8, 2007
    Location:
    Cambridge, MA
    #7
    The rule with the random() function is and has always been to only use it for generating seeds to other, better random generators.

    Here's a random number generator I included in my own code recently. It's the portable 'ran1' generator recommended by Numerical Recipes in C. It generates uniformly distributed random numbers from the set (0,1) with a period of ~10^9.

    Code:
    #define IA 16807
    #define IM 2147483647
    #define AM (1.0 / IM)
    #define IQ 127773
    #define IR 2836
    #define NTAB 32
    #define NDIV (1 + (IM - 1) / NTAB)
    #define EPS 1.2e-7
    #define RNMX (1.0 - EPS)
    
    /* 
    Minimal random number generator of Park and Miller with Bays - Durham shuffle and added safeguards. Returns a uniform random deviate between 0.0 and 1.0 (exclusive of the endpoint values). Call with idum a negative integer to initialize; thereafter, do not alter idum between successive deviates in a sequence. RNMX should approximate
    the largest floating value that is less than 1.
     */
    
    float ran1(long *idum)
    {
     int  j;
     long k;
     static	long iy = 0;
     static long iv[NTAB];
     float  temp;
    
    
    if (*idum <= 0 || !iy)
    {
     /*
      * Initialize.
      */			
       if (-(*idum) < 1) *idum = 1;
       /* Be sure to prevent idum = 0. */
       else	*idum =	-(*idum);
    
       for (j = NTAB + 7; j >= 0; j--)
    	{	
             /* 
              * Load the shuffle table (after 8 warm - ups).
    	  */
    	  k = (*idum) / IQ;
              *Idum = IA * (*idum - k * IQ) - IR * k;
    	  if (*idum < 0) *idum += IM;
    	  if (j < NTAB)	iv[j] =	*idum;
              }
    		
      iy = iv[0];
     }
    
    /* 
     * Start here when not initializing.
     */
    
     k = (*idum) / IQ;
    
    /*	
    Compute	idum = (IA * idum) % IM	without overflows by Schrage's method.
    */
     * idum = IA * (*idum - k * IQ) - IR * k;
      if (*idum < 0) *idum += IM;
    
    /*
    * Will be in the range 0..NTAB -1.
    */  
    j = iy / NDIV;
    
    /*	
     * Output previously stored value and refill the shuffle table
    */
     iy = iv[j];
     iv[j] = *idum;
    		
    /* 
     * Because users don't expect endpoint values
     */
    
    if ((temp = AM * iy) > RNMX) return RNMX;
    else return temp;
    
    }
    
    If you want to generate uniform random deviates for simulations etc., this is a good algorithm.

    For encryption, you're best off using the OpenSSL library versus trying to hand code your own ciphers.
     
  8. macrumors G5

    gnasher729

    Joined:
    Nov 25, 2005
    #8
    I couldn't tell you anything about random numbers in the iPhone SDK, because that is under NDA, but what makes you think that it would be any different than in any other Unix system? (In Terminal: "man random").
     
  9. macrumors 65816

    Muncher

    Joined:
    Apr 19, 2007
    Location:
    California
    #9
    This guy seems to know what he's talking about, listen to him. :D
     
  10. macrumors member

    DenNukem

    Joined:
    Jul 12, 2008
    Location:
    Seattle
    #10
    Two things:

    1. Look for SecRandomCopyBytes in SDK documentation. It does not work in emulator (gotta be a bug), but it does work on real device.
    2. Using crypto will make you subject to US export regulations. Apple will demand compliance paperwork when you submit app to the app store, regardless of where you plan to sell it. So you might want to reconsider that crypto thing, or seek professional help there.
     
  11. macrumors member

    Joined:
    Mar 25, 2002
    #11
    random int generator

    I use these defines for random int's. I call RANDOM_SEED() once in my app, the call something lie RANDOM_INT(1,10) will return a random number between 1 and 10. Works great.


    #define RANDOM_SEED() srandom(time(NULL))
    #define RANDOM_INT(__MIN__, __MAX__) ((__MIN__) + random() % ((__MAX__+1) - (__MIN__)))
     

Share This Page