-3

For some reason I'm not able to find any sort of official doc telling me what the range is for arc4random(). I've seen in some non-authoritative sources that it's 2^32 - 1, a little over 4 billion.

Can anyone confirm this? If so, can you link to an official doc showing this number somewhere? I'm trying to generate a random number on my iOS app and need to have a pretty official upper end for the algorithm to work correctly.

Mogsdad
  • 44,709
  • 21
  • 151
  • 275
Bill L
  • 2,576
  • 4
  • 28
  • 55
  • 3
    [this source](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/arc4random.3.html) is not "authoritarian" enough? – Eugene Sh. Mar 02 '16 at 21:41
  • 1
    Same page within 10 seconds by googling `arc4random`, top link (Apple) says *"The arc4random() function returns pseudo-random numbers in the range of 0 to (2**32)-1"*. – Weather Vane Mar 02 '16 at 21:43

2 Answers2

3

The man page for arc4random says:

The arc4random() function returns pseudo-random numbers in the range of 0 to 232 – 1…

And, happily, this matches its return type of uint32_t. That is, arc4random may return any 32-bit unsigned integer. The inclusive upper bound is UINT32_MAX (or UInt32.max in Swift).

However, if you just need numbers uniformly distributed within a particular range, you should use arc4random_uniform(n) (the range is exclusive: arc4random_uniform(5) can return 0, 1, 2, 3, or 4). This is more correct — and more convenient! — than using % to truncate the range returned by regular arc4random().

jtbandes
  • 115,675
  • 35
  • 233
  • 266
0

You are right,

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 pseudorandom
 random numbers in the range of 0 to (2**32)-1, and therefore has twice the range of rand(3) and
 random(3).

arc4random_buf() function fills the region buf of length nbytes with ARC4-derived random data.

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.

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() functions family, since they auto-matically automatically matically initialize themselves.

Source https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/arc4random.3.html

Ulysses
  • 2,281
  • 1
  • 16
  • 24
  • Can you add something of your own to this copy-paste? Even fixing the formatting and highighting the relevant phrase would be a start. – jscs Mar 02 '16 at 21:52