Random Numbers

What is the approved method of getting a random number in macOS in Objective C? Presently I'm using:



	srandomdev();
    randomDevice = fopen("/dev/random", "r");
//
//
//

-(uint64)random64
{
    uint64_t    value = 0;
    int         i;

   for (i = 0 ; i < sizeof(value); i++)
    {
        value <<= 8;
        value |= fgetc(randomDevice);
    }

    return value;
}

However, this method no longer appears in the documentation. Is there a more modern implementation?

Accepted Reply

I found the docs I needed: [https://developer.apple.com/documentation/security/1399291-secrandomcopybytes?language=objc). The core foundation security services api contains the appropriate system call. The modern implementation of the above would be:

-(uint64)random64
{
    uint64_t    value = 0;
    uint8       randomByte;
    int         i, err;

   for (i = 0 ; i < sizeof(value); i++)
    {
        value <<= 8;
        err = SecRandomCopyBytes( kSecRandomDefault ,  1 ,  &randomByte );
        value |= randomByte;
    }

    return value;
}

Replies

Check out the arc4random_uniform function.

  uint32_t randomNumber = arc4random_uniform(25);

I found the docs I needed: [https://developer.apple.com/documentation/security/1399291-secrandomcopybytes?language=objc). The core foundation security services api contains the appropriate system call. The modern implementation of the above would be:

-(uint64)random64
{
    uint64_t    value = 0;
    uint8       randomByte;
    int         i, err;

   for (i = 0 ; i < sizeof(value); i++)
    {
        value <<= 8;
        err = SecRandomCopyBytes( kSecRandomDefault ,  1 ,  &randomByte );
        value |= randomByte;
    }

    return value;
}

There’s two cases here:

  • Cryptographically sound random numbers

  • Pseudo random numbers

It sounds like you want the former, in which case I agree that SecRandomCopyBytes is a good option. However, you can get all eight bytes at once:

- (uint64)random64 {
    uint64_t result;
    OSStatus err = SecRandomCopyBytes(kSecRandomDefault, sizeof(result), &result);
    assert(err == errSecSuccess);
    return result;
}

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"