2011-10-13 4 views
20

게임을 실행할 때마다 출력되는 임의의 숫자가 동일한 순서로 출력됩니다. 왜 이런 일이 일어나는 걸까요?프로그램을 실행할 때마다 동일한 난수가 표시됩니다.

나는

#include <cstdlib> 

이 있고 난수를 생성하기 위해 사용하고

당신은 당신의 난수 생성기 시드 할 필요가
randomDiceRollComputer = 1 + rand() % 6; 
+0

http://en.wikipedia.org/wiki/Pseudorandom_number_generator – DuckMaestro

답변

26

:

가의 시작 부분이 퍼팅 시도를 프로그램 :

srand (time(NULL)); 

#include <ctime>이 필요합니다.

아이디어는 프로그램을 실행할 때마다 RNG에 다른 번호를 지정하는 것입니다. 시간을 시드로 사용하면 프로그램을 시작할 때마다 다른 번호를 얻게됩니다.

+0

흠 정확히 씨앗 뿌리기의 의미는 무엇입니까? – mystycs

+4

기본적으로 RNG는 실제로 무작위가 아닙니다. 그들은 겉보기 (의사) 난수를 생성하는 수식을 사용합니다. 그리고 그것들은 시퀀스 생성을 시작하기위한 "출발점"이 필요합니다. 시드하지 않으면 동일한 기본 시드를 사용하고 매번 동일한 순서를 생성합니다. – Mysticial

+2

더 나은 결과를 얻으려면'srand' 다음에'rand'를 한 번 호출하고 반환 값을 버립니다. 비슷한 씨앗도 비슷한 첫 번째 값을 생성하지만 빠르게 번식합니다. –

7

랜덤 넘버 생성기에 시드를 제공해야합니다. 이것은 현재의 시간을 취함으로써 이루어질 수 있습니다. 이것은 희망적으로 어떤 종류의 무작위적인 것입니다.

#include <cstdlib> 
#include <ctime> 
using namespace std; 

int main() 
{ 
    int r; 
    srand(time(0)); 
    r = rand(); 
    return 0; 
} 
0

의사 난수 생성기는 시작 번호 또는 시드를 취한 다음이 순서에서 다음 번호를 생성합니다. 이것이 그들이 pseudorandom이라 불리는 이유입니다. 왜냐하면 그들은 항상 같은 시작 값을 사용하기 때문에 C 표준 lib 생성기와 같은 일련의 숫자를 생성하기 때문입니다. 발전기에 다음에 프로그램이 현재 시간과 같이 실행될 때 변경되는 시작 값을 제공하면이 문제를 해결할 수 있습니다.

어쨌든, 당신이 말한과 같은 다른 찾고있는 코드는 다음과 같습니다 주어진 씨앗을 파종 할 때 rand() 기능은 특히 숫자의 동일한 시퀀스를 생성하는 데 필요한

srand(time(0)); //Seed the generator, give it a starting value 
+0

아니, 그들은 ' 의사 랜덤 (pseudorandom)이라고 불리는 이유는 수학적 의미에서 랜덤하지 않기 때문입니다. 실행될 때마다 고유 번호를 생성하는 PRNG는 여전히 의사 난수입니다. –

+0

@KeithThompson 알다시피, 나는 그것이 PRNG의 특정 유형이 PRNG 인 이유입니다. 보다 일반적으로 PRNG는 의사 결정 알고리즘을 사용하여 시퀀스의 각 값을 찾아 내기 때문에 의사 난수라고합니다. – jgon

1

(srand()를 호출하여) ; 가능한 각 시드 값은 시퀀스를 지정합니다. srand()으로 절대 전화하지 않으면 rand()을 호출하기 전에 srand(1)으로 전화하여 동일한 시퀀스를 얻습니다.

(이것은 다른 C 또는 C++ 구현에 적용되지 않습니다.)

이 테스트 목적으로 유용 할 수 있습니다. 예를 들어, 프로그램에 버그가있는 경우 동일한 시드로 다시 실행하여 코드를 재현 할 수 있습니다. 다른 예측할 수없는 동작을 제외하면 동일한 일련의 의사 난수를 얻을 수 있습니다.

더 많거나 적은 예측할 수없는 의사 난수를 얻으려면 보통 srand(time(NULL))을 호출하는 것이 좋습니다. 하지만 완벽하지는 않습니다. 같은 초에 프로그램이 두 번 실행되면 time() (일반적으로)의 해상도가 1 초이므로 동일한 순서를 얻게됩니다. 그리고 전형적인`rand() 구현체는 이 아니고 암호화 용도로 사용할 수있는이 아닙니다. 공격자가 당신이 얻고 자하는 숫자를 쉽게 추측 할 수 있습니다.

다른 난수 구현이 많이 있습니다. Linux 시스템에는 두 개의 의사 장치 인 /dev/random/dev/urandom이 있으며,이 장치를 통해 비교적 높은 품질의 의사 임의 바이트 값을 읽을 수 있습니다.일부 시스템은 random(), drand48() 등과 같은 기능을 가질 수 있습니다. 그리고 수많은 알고리즘이 있습니다. Mersenne Twister에 대한 좋은 소식을 들었습니다.

게임처럼, 속이려고하는 플레이어를 기대하거나 신경 쓰지 않는 곳이면 srand(time(NULL))rand()으로 충분할 것입니다. 더 진지한 목적을 위해, 당신은 내가하는 것보다이 물건에 대해 더 많이 알고있는 누군가로부터 조언을 얻어야합니다.

comp.lang.c FAQ의 13 절에는 의사 난수 생성에 관한 몇 가지 매우 유용한 정보가 있습니다.

관련 문제