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