在64位系统中种子随机数生成器

4
随着iPhone 5S的更新,我希望我的应用程序能够支持新的64位处理器。
然而,使用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(),因为我还需要能够对随机数生成器进行种子处理,以获得可重复的结果。
2个回答

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

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

srandom(arc4random());

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

C++ <random> 文档


3

我需要进行种子初始化,因为它必须是可重复的。这个种子被许多设备共享,所以它们会得到完全相同的随机数结果。 - gabriellanata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接