种子随机64位

时间:2013-09-10 23:51:11

标签: ios objective-c random 64-bit

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

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

目前的代码很简单:

srandom(time(NULL));

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

  1. 将长整数转换为unsigned int
  2. 将“time(NULL)”替换为执行相同作业但返回unsigned int的其他函数。
  3. 您会推荐哪一个以及我应该使用哪种功能?

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

2 个答案:

答案 0 :(得分:7)

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

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

srandom(arc4random());

您可以考虑转移到Objective-C ++,这样您就可以使用标准的C ++ <random>库,它比其他库更加强大和灵活,并且能够更简单,更直接地表达许多想法。库

C++ <random> documentation

答案 1 :(得分:3)

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