2014-02-27 121 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