2012-11-26 81 views
1

什麼是ObjC上最好的種子隨機數發生器?種子隨機數發生器

我必須在2個不同的iPhone上生成相同的隨機數字序列,因此必須播種。這就是爲什麼我不能使用arc4rand()

注:最好的我的意思是最快/最不可預測的關係。

回答

1

附帶C++標準庫的Mersenne Twister implementation非常好。因爲它是C++,所以您需要創建一個包裝器,以便您可以從C和ObjC代碼中調用它,或者重命名使用它的文件以獲得.mm(Objective-C++)擴展名。

我在想這樣的事情,在標題:

#ifdef __cplusplus 
extern "C" { 
#endif 

struct rng_state; 
struct rng_state* create_rng(unsigned seed); 
void destroy_rng(struct rng_state* rng); 
unsigned long long rng_random_unsigned(struct rng_state* rng, unsigned long long max); 

#ifdef __cplusplus 
} 
#endif 

,然後在一個.cpp文件,其中包括上面:

#include <random> 
struct rng_state 
{ 
    std::mt19937* rng; 
}; 
struct rng_state* create_rng(unsigned seed) 
{ 
    std::mt19937* engine = new std::mt19937(seed); 
    rng_state* state = new rng_state; 
    state->rng = engine; 
} 
void destroy_rng(struct rng_state* rng) 
{ 
    delete rng->rng; 
    delete rng; 
} 
unsigned long long rng_random_unsigned(struct rng_state* rng, unsigned long long max) 
{ 
    std::uniform_int_distribution<unsigned long long> distribution(0, max); 
    return distribution(*rng->rng); 
} 

我沒有測試上面,但它應該非常接近。然後,您可以像往常一樣將頭文件包含在C/ObjC文件中,使用種子創建一個rng,獲得一堆隨機數字,並在完成後摧毀rng。如果需要,您還可以添加更多的生成器函數 - 庫可以使用不同的隨機分佈。

+0

爲什麼要使用和extern庫? ObjC中沒有任何東西嗎? srand和rand呢? – Daniel

+0

當然,你可以使用srand和rand。但是,它們依賴於全局狀態,所以如果有其他調用'rand()'(或'srand()')它會干擾你的序列。也不能保證它會在不同的操作系統版本上生成相同的序列(儘管這是一個小風險)。我不確定C++標準庫的定義是「外部的」 - 它隨OS /開發環境一起提供。 – pmdj