2012-11-26 3 views
1

ObjC에서 가장 좋은 시드 난수 생성기는 무엇입니까?시드 난수 생성기

두 개의 다른 iPhone에서 동일한 임의의 숫자 시퀀스를 생성해야하므로 시드해야합니다. 이것이 내가 arc4rand()을 사용할 수없는 이유입니다.

참고 : 가장 빠른 것은 예측할 수없는 가장 빠른 관계입니다.

답변

1

C++ 표준 라이브러리와 함께 제공되는 Mersenne Twister implementation은 매우 좋습니다. C++이기 때문에 C 및 ObjC 코드에서 호출하거나 .mm (Objective-C++) 확장자를 사용하는 파일의 이름을 바꿀 수 있도록 래퍼를 만들어야합니다.

내가 헤더에이 같은 생각 해요 : 나는 테스트하지 않았습니다

#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); 
} 

: 위의 내용을 포함하는 .cpp 파일에 다음

#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 

그리고 위와 비슷하지만 꽤 가깝습니다. 평소와 같이 C/ObjC 파일에 헤더를 포함시키고, 시드와 함께 rng를 만들고, 무작위 숫자를 얻고, 완료되면 rng를 파괴 할 수 있습니다. 필요한 경우 생성기 기능을 추가 할 수도 있습니다. 라이브러리에는 사용할 수있는 임의의 다른 배포판이 함께 제공됩니다.

+0

왜 extern 라이브러리를 사용해야합니까? ObjC에 아무것도 없습니까? srand와 rand는 어떻습니까? – Daniel

+0

물론 srand와 rand를 사용할 수 있습니다. 그러나 그들은 전역 상태에 의존하기 때문에 다른 어떤 것이'rand()'(또는'srand()')를 호출하면 여러분의 순서를 방해하게됩니다. 다른 OS 버전에서도 동일한 시퀀스가 ​​생성 될 것이라는 보장은 없습니다 (작은 위험 임에도 불구하고). 어떤 정의로 C++ 표준 라이브러리가 "외부"인지는 잘 모르겠다. OS/개발 환경과 함께 제공된다. – pmdj