【问题标题】:Seeded random number generator种子随机数生成器
【发布时间】:2012-11-26 22:27:50
【问题描述】:

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

我必须在 2 部不同的 iPhone 上生成相同的随机数序列,因此必须对其进行播种。这就是为什么我不能使用arc4rand()

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

【问题讨论】:

    标签: iphone objective-c random


    【解决方案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。如果需要,您还可以添加更多生成器函数 - 该库带有您可以使用的不同随机分布。

    【讨论】:

    • 为什么要使用和外部库? ObjC中没有任何东西吗? srand 和 rand 呢?
    • 当然,你可以使用 srand 和 rand。但是,它们依赖于全局状态,因此如果有任何其他调用 rand()(或 srand()),它会干扰您的序列。也不能保证它会在不同的操作系统版本上生成相同的序列(尽管这是一个小风险)。我不确定 C++ 标准库的“外部”定义是什么——它随操作系统/开发环境一起提供。
    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2011-02-08
    • 2021-05-15
    • 2015-03-14
    相关资源
    最近更新 更多