gab*_*ata 4 random 64-bit objective-c ios
通过iPhone 5S更新,我希望我的应用程序能够支持新的64位处理器.
但是,如果将较大的数据类型转换为较小的数据类型,则使用64位可能会导致截断,如将long转换为int的情况.大多数情况下,这可以通过使用更大的数据类型轻松修复,但在随机数生成器的情况下,有时使用"time(NULL)"函数播种,我不能这样做.
目前的代码很简单:
srandom(time(NULL));
Run Code Online (Sandbox Code Playgroud)
但是在带有64位的XCode 5中,它会导致以下错误:Implicit conversion loses integer precision: 'time_t' (aka 'long') to 'unsigned int'.这是因为"time(NULL)"返回一个长整数,"srandom"需要unsigned int.因此有两种选择:
你会推荐哪一个,我应该用什么功能来做呢?
注意:我使用random()而不是arc4random()因为我还需要能够为随机数生成器播种以获得可重复的结果.
time()通常返回自纪元以来的秒数(不计算闰秒),这意味着如果您在一秒钟内多次使用它(或两个人同时运行程序),那么它将返回相同的值,从而导致即使你不想要它也会重复.我建议不要使用time(NULL)作为种子,即使没有由截断引起的警告(或错误 - -Werror).
您可以arc4random()根据时间使用随机种子而不是种子.它也会返回一个无符号的32位值,它将修复你看到的错误.
srandom(arc4random());
Run Code Online (Sandbox Code Playgroud)
您可以考虑转移到Objective-C++,这样您就可以使用标准的C++ <random>库,它比其他库更加强大和灵活,并且能够更简单,更直接地表达许多想法.
| 归档时间: |
|
| 查看次数: |
1794 次 |
| 最近记录: |