种子随机数发生器

时间:2012-11-26 14:14:27

标签: iphone objective-c random

ObjC上最好的种子随机数生成器是什么?

我必须在2个不同的iPhone上生成相同的随机数序列,因此必须进行播种。这就是我无法使用arc4rand()

的原因

注意:最好的意思是最快/最不可预测的关系。

1 个答案:

答案 0 :(得分: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。如果需要,您还可以添加更多生成器函数 - 库随附您可以使用的不同随机分布。

相关问题