1
什么是ObjC上最好的种子随机数发生器?种子随机数发生器
我必须在2个不同的iPhone上生成相同的随机数字序列,因此必须播种。这就是为什么我不能使用arc4rand()
。
注:最好的我的意思是最快/最不可预测的关系。
什么是ObjC上最好的种子随机数发生器?种子随机数发生器
我必须在2个不同的iPhone上生成相同的随机数字序列,因此必须播种。这就是为什么我不能使用arc4rand()
。
注:最好的我的意思是最快/最不可预测的关系。
附带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。如果需要,您还可以添加更多的生成器函数 - 库可以使用不同的随机分布。
为什么要使用和extern库? ObjC中没有任何东西吗? srand和rand呢? – Daniel
当然,你可以使用srand和rand。但是,它们依赖于全局状态,所以如果有其他调用'rand()'(或'srand()')它会干扰你的序列。也不能保证它会在不同的操作系统版本上生成相同的序列(尽管这是一个小风险)。我不确定C++标准库的定义是“外部的” - 它随OS /开发环境一起提供。 – pmdj