2013-08-08 4 views
0

그래서 srand()에 의해 생성 된 숫자를 기반으로 몇 가지 결과를 계산하는 C 코드가 있습니다. 동일한 시드 번호를 사용하면 결과는 항상 동일합니다.C 또는 Java (Android)의 모든 함수가 srand()를 엉망으로 만들 수 있습니까?

이제 Android 앱에서 JNI를 통해 이러한 C 코드를로드합니다. 그러나 동일한 시드 번호가 사용 되더라도 결과는 달라집니다. 시드 번호를 두 번 확인하여 동일한지 확인했습니다. 그러나 Android 프로그램과 원시 코드는 모두 복잡하기 때문에이 문제를 일으키는 원인을 파악하기가 힘듭니다.

확실한 것은, 우리는 자바 프로그램에서 함수를 사용하여 난수를 생성하지 않았다는 것입니다. 아마도 srand()는 매번 다른 시드 번호로 호출되지 않을 것입니다. Java 또는 C의 다른 함수가 srand()가 생성 한 난수를 변경할 수 있습니까?

감사합니다.

업데이트 : 내 질문에 다소 혼란 스러웠습니다. 명확히하기 위해, 내가 비교하고있는 결과는 같은 플랫폼이지만 다른 실행 결과입니다. C 코드는 숫자를 얻기 위해 rand()를 사용하여 결과를 계산합니다. 따라서 srand()의 시드 번호가 항상 같으면 rand()가 얻는 숫자는 같아야하고 결과도 동일해야합니다. 하지만 어쨌든 나는 srand()와 같은 seed를 사용한다. rand()는 다른 숫자를 준다.

+0

[SSCCE] (http://www.sscce.org) – nachokk

+0

'rand()'가 숫자를 생성하는 것을 고려하십시오. 'srand()'만 (re) 생성자를 설정합니다. –

+0

리눅스에서는'int rand_r (unsigned int)'함수가 있는데, 이것은 재진입 성이 있기 때문에 문제가 해결되지 않더라도 문제를 해결할 수 있습니다. –

답변

1

rand()에 의해 구현되는 의사 랜덤 알고리즘은 C 라이브러리에 의해 결정되며 이에 대한 표준 알고리즘은 없습니다. 하나의 구현에서 다음 구현으로 동일한 일련의 숫자를 가져 오는 것이 절대적으로 보장되는 것은 아니며 Android 구현이 개발 환경과 다른 것처럼 들립니다. 플랫폼간에 예측 가능한 시퀀스가 ​​필요한 경우 자체 난수 생성기를 구현해야합니다.

+0

답해 주셔서 감사합니다. C 코드를로드하는 간단한 앱을 만들어 안드로이드에서 C 코드를 테스트했습니다. 올바른 결과를 얻고 있습니다 ... rand() 출력을 변경하는 것이 무엇인지 알지 못합니다 ... – Bach

+0

Android에서 동일한 테스트를 거쳐 우연히 같은 난수 시퀀스를 발견하더라도 거대한 위험은 그것에 의존합니다. 모든 C 라이브러리 갱신은 잠재적으로 rand()가 사용하는 알고리즘을 변경할 수 있습니다.당신이 그것에 의지하고 싶다면 적어도 괜찮습니다. (그리고 어딘가에있는 어떤 문서에서) 당신의 마음의 뒤쪽에 보관하십시오. –

2

난수 생성기에는 여러 가지 유형이 있으며 플랫폼마다 다를 수 있습니다. 프로젝트에 크로스 플랫폼 100 % 예측 가능한 솔루션이 필요한 경우 직접 작성해야 할 것입니다.

그것은 ... 그것은 소리 수 있으므로 정말 나쁘지 않다

나는 (내 프로젝트에 사용할 것입니다) 같은 메르 센 트위스터 알고리즘으로 난수 생성을 찾고 권장 쓸 것

모든 프로젝트에서 공유 할 수있는 작은 코드 블록 이것은 또한 다양한 씨앗을 가진 여러 개의 발전기를 가질 수 있다는 이점을 제공합니다. 이는 퍼즐 게임과 같은 용도로 유용합니다. 퍼즐을 생성하기 위해 특정 시드를 기반으로 예측 가능한 무작위 세트를 원할 수 있습니다. 특별한 FX 나 다른 게임 요소를 랜덤 화하기위한 시드 생성기.

+0

@Bach 업데이트가 진행되는 한 ...'rand()'를 호출하고 호출이 동기화되지 않게하는 다른 라이브러리 나 다른 코드 섹션 (사용자가 작성하지 않은)이있을 수 있습니다. 이것은 다른 코드 영역에서 발생하는 충돌이 없도록 자신 만의 또 다른 좋은 이유입니다. – Mattingly

+0

다른 함수가 Xi가 저장된 내부 버퍼를 변경할 수 있습니까? – Bach

+0

@ 'Xi'가 당신의 종자 가치입니까? 무엇이든 가능하지만 가장 가능성있는 케이스는'srand()'가 호출 한 후에 다른 누군가에 의해 호출되는 경우입니다 (첫 번째 숫자조차 다를 경우) ... 또는'rand()'가 호출됩니다 당신이 알지 못하는 또 다른 장소에서 다음 임의의 숫자를 계산하는 데 사용 된 테이블을 업데이트하여 다른 하나를 제공합니다. – Mattingly