2012-11-26 82 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