4

随着 iPhone 5S 的更新,我希望我的应用程序能够支持新的 64 位处理器。

但是,如果将较大的数据类型转换为较小的数据类型,例如将 long 转换为 int,则使用 64 位可能会导致截断。大多数情况下,这可以通过使用更大的数据类型轻松解决,但对于有时使用“time(NULL)”函数播种的随机数生成器,我无法做到这一点。

当前代码很简单:

srandom(time(NULL));

但是在具有 64 位的 XCode 5 中,它会导致以下错误:Implicit conversion loses integer precision: 'time_t' (aka 'long') to 'unsigned int'. 这是因为“time(NULL)”返回一个长整数,而“srandom”需要一个无符号整数。因此有两种选择:

  1. 将长整数转换为无符号整数
  2. 将“time(NULL)”替换为另一个执行相同工作但返回无符号整数的函数。

你会推荐哪一个,我应该使用什么功能来做到这一点?

注意:我使用 random() 而不是 arc4random() 因为我还需要能够播种随机数生成器以获得可重复的结果。

4

2 回答 2

7

time()通常返回自纪元以来的秒数(不计算闰秒),这意味着如果您在一秒钟内多次使用它(或两个人同时运行程序),那么它将返回相同的值,从而导致重复的序列,即使你不想要它。我建议不要将time(NULL)其用作种子,即使没有由截断引起的警告(或 -Werror 错误)。

您可以使用arc4random()获取随机种子而不是基于时间的种子。它也恰好返回一个无符号的 32 位值,它将修复您看到的错误。

srandom(arc4random());

您可能会考虑迁移到 Objective-C++,以便可以使用标准 C++<random>库,它比其他库更强大、更灵活,并且可以更简单、更直接地表达许多想法

C++<random>文档

于 2013-09-11T15:53:10.037 回答
3

在 iOS 上,只需使用arc4random(3),不用担心播种。

于 2013-09-10T23:53:06.210 回答