2013-09-10 82 views
4

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

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

当前的代码很简单:

srandom(time(NULL)); 

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

  1. 转换为一个unsigned int
  2. 替换“时间(NULL)”与其他功能,做同样的工作,但返回一个unsigned int长整型。

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

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

回答

7

time()通常返回自纪元(不包括闰秒),这意味着如果你使用比一次更在第二(或两个人跑在同一时间程序),那么它会返回的秒数相同的值,即使不需要时也会导致重复序列。我建议不要使用time(NULL)作为种子,即使没有由于截断导致的警告(或者错误)。

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

srandom(arc4random()); 

你可能会考虑迁移到的Objective-C++,这样就可以使用标准的C++ <random>库,这是更为强大和灵活,这也使的很多想法更简单,更直接的表达,除了这些之外图书馆

C++ <random> documentation

+0

这就是我需要的,谢谢! – gabriellanata

3

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

+0

我需要种子,因为它必须是可重复的。种子被许多设备共享,因此它们得到完全相同的随机数结果。 – gabriellanata