2014-02-27 115 views
0

我使用这个功能来随机的X我的精灵之一的坐标:播种随机数生成器

static inline CGFloat skRandf(){ 
    return rand()/(CGFloat) RAND_MAX; 
} 
static inline CGFloat skRand(CGFloat low, CGFloat high){ 
    return skRandf() * (high - low) + low; 
} 

它工作正常,但如果我玩游戏好几次我注意到x我应用它的精灵坐标每次都是一样的。有没有办法改变这个问题,或者随着时间的推移来解决这个问题呢?任何帮助将非常感激。

+1

阅读关于'rand()'的文档。 – rmaddy

回答

1

使用arc4random尝试(),而不是因为它不要求设置的种子,并采用了更先进的算法。

static inline CGFloat skRandf(){ 
    return arc4random()/(CGFloat) RAND_MAX; 
} 
static inline CGFloat skRand(CGFloat low, CGFloat high){ 
    return skRandf() * (high - low) + low; 
} 
+1

RAND_MAX意味着与rand(),而不是arc4random()一起使用。手册页状态arc4random()是rand()的两倍范围。相反,你应该除以UINT32_MAX。 –

+0

'arc4random'也比'rand'慢很多。对于游戏中的许多“随机”事物,你不需要真正的密码质量(伪)随机性,因此坚持“rand”并不是那么糟糕。看到它的手册页如何使用'srand'播种。 (与'时间播种()'是确保你没有看到相同的模式每次运行应用时,还不错。在另一方面,确保你看你每次运行应用程序可以是相同的模式在开发过程中很好的测试。) – rickster

+0

第二个功能应该提醒时除以范围,而不是乘法。 '静态内嵌CGFloat的SKRAND(CGFloat的低,高CGFloat的) { 回报((skRandf()%(高 - 低))+低); }' – Srikanth