随机数的生成

如何生成一个 Objective-C 的随机数

具体而言,产生一个 0 和 N - 1 之间的随机数,使用 arc4random_uniform(),从而避免模偏差(modulo bias)。

  1. 0 到 N - 1 之间的随机整数

    NSUInteger r = arc4random_uniform(N);

  1. 1 到 N 之间的随机整数

    NSUInteger r = arc4random_uniform(N) + 1;

  1. 0 到 1 之间的随机浮点数(double)

如果你要生成一个随机 double 或 float,另一个很好的选择是功能较模糊的 rand48 家族,包括 drand48(3)。

srand48(time(0));
double r = drand48();

不像 arc4random 函数, rand48 函数在产生随机数之前需要种子的初始值。这个种子函数 srand48(3) 应该只运行一次

我如何从一个 NSArray 选择一个随机元素?

if ([array count] > 0) {
  id obj = array[arc4random_uniform([array count])];
}

我如何随机排序一个 NSArray?

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
NSUInteger count = [mutableArray count];

if (count > 1) {
  for (NSUInteger i = count - 1; i > 0; --i) {
      [mutableArray exchangeObjectAtIndex:i withObjectAtIndex:arc4random_uniform((int32_t)(i + 1))];
   }
}
NSArray *randomArray = [NSArray arrayWithArray:mutableArray];

生成一个随机的小写 NSString

如果你是对一个已知的,连续范围的 Unicode 字符做处理,例如小写字母 (U+0061 — U+007A),你可以从 char 做一个简单的换算:

NSString *letter = [NSString stringWithFormat:@"%c", arc4random_uniform(26) + 'a'];

从一个 NSString 选择一个随机字符

另外,从一组你选择的字符中来挑选随机字母的一个简单的方法是简单地创建一个包含所有可能的字母的字符串:

NSString *vowels = @"aeiouy";
NSString *letter = [vowels substringWithRange:NSMakeRange(arc4random_uniform([vowels length]), 1)];

为什么要使用 arc4random(3),而不是 rand(3) 或 random(3)?

arc4random 不需要初始种子(用 srand 或 srandom),使它更加容易使用。
arc4random 范围可达 0x100000000 (4294967296),而 rand 和 random 的上限在 RAND_MAX = 0x7fffffff (2147483647)。
rand 经常定期被周期低位的方式,使其更可预测执行。

什么是 rand(3), random(3), 和 arc4random(3),以及它们从哪里来的?

rand 是一个标准的 C 函数。
random 是定义为 POSIX 标准的一部分。
arc4random 是在 BSD 和派生平台。