如何在Objective-C中播种rand()函数?

时间:2012-08-25 05:21:04

标签: objective-c ios c random srand

我正在开发的部分是随机公司名称生成器。它从几个名称部分数组中提取。我使用rand()函数绘制随机名称部分。但是,每次我启动应用程序时,相同的“随机”数字始终以相同的顺序生成,因此始终显示相同的名称。

所以我在SO周围搜索,并且在C中有一个srand()函数来“播种”随机函数,其中包含当前时间以使其更随机 - 如srand(time(NULL))。 Objective-C是否可以用于iOS开发?

2 个答案:

答案 0 :(得分:29)

为什么不使用不需要种子的arc4random?你这样使用它:

int r = arc4random();

Here's将其与rand()进行比较的文章。与arc4random()相比,rand()手册页对此进行了说明:

  

arc4random()函数使用arc4密码使用的密钥流生成器,它使用8 * 8 8        位S-Boxes。 S-Box可以处于大约(2 1700)个状态。 arc4random()函数返回伪 -        随机数在0到(2 32)-1的范围内,因此 rand(3)范围的两倍        随机(3)。

如果您想要一个范围内的随机数,可以使用arc4random_uniform()功能。例如,要生成0到10之间的随机数,您可以这样做:

int i = arc4random_uniform(11);

以下是手册页中的一些信息:

  

arc4random_uniform(upper_bound)将返回小于upper_bound的均匀分布的随机数。 arc4random_uniform()建议使用像``arc4random()%upper_bound''这样的结构,因为当上限不是2的幂时,它避免了“模偏差”。

答案 1 :(得分:8)

函数rand()srand()是标准C库的一部分,就像使用Objective-C在iOS开发中完全可用的C库的其余部分一样。请注意,这些例程已被random()srandom()取代,rand()srand()几乎完全相同地调用srandomdev()和{{1}}约定,但会产生更好的结果,周期更长。还有一个{{1}}例程,它使用随机数设备初始化随机数发生器的状态。它们也是标准C库的一部分,可在iOS-Objective-C中使用。