2013-12-17 1 views
17

저는 C와 C++에 상대적으로 새로운 것 같습니다. 자바에서는 프로그래밍에 익숙한 언어 인 난수 생성을 매우 쉽게 구현할 수 있습니다. Math라는 클래스에서 정적 임의 메서드를 호출하면됩니다. 난수 생성기 - 매번 시드하는 이유는 무엇입니까

int face = ((int)(Math.random() * 6) + 1); 

당신이 "씨 난수 생성기"에있는 C와 C++에서

의부터 srand 함수를 호출하여 주사위 던지기를 ... 시뮬레이션

srand (time(NULL)); 

이 작업을 수행하는 시점은 무엇입니까? 즉, 코드를 실행할 때마다 난수 생성기를 시드해야한다는 이점이 있습니까?

+14

메모 : 특정 코드가 실행될 때마다 코드를 시드하지 마십시오. 프로세스가 시작될 때마다 시드해야합니다. –

+1

@RogerLipscombe 그것은 정말로 당신이 달성하고자하는 것에 달려 있습니다. – juanchopanza

+0

[wikipedia] (http://en.wikipedia.org/wiki/Pseudorandom_number_generator) 문서가 꽤 좋습니다. Java에서는 첫 번째 호출에서 여전히 PRNG를 시드하지만 [해당 사항 없음] (http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#random()).) – kbshimmyo

답변

10

발전기를 시드하지 않으면 프로그램을 실행할 때마다 시드가 동일해질 것이고 난수 시퀀스는 매번 동일 할 것입니다.

또한 프로그램의 시작 부분에 한 번만 생성기를 시드해야합니다.

8

장점은 동일한 시드를 제공하여 임의의 숫자 시퀀스를 반복 할 수 있다는 것입니다.

게임 엘리트는 수천 개의 별들로 구성된 전체 세계를 하나의 숫자로 저장하는 데이 게임을 사용했습니다. 동일한 세계를 두 번째로 생성하려면 방금 동일한 시드가 제공되었습니다.

+4

이것은 난수 생성과 관련된 코드를 디버깅하는 데 매우 유용합니다. – kbshimmyo

+0

사실. 대부분 예측할 수없는 씨앗을 원하지만 관측 한 행동을 재연하는 능력을 원한다면 결과와 함께 사용 된 씨앗을 프로그램에 표시/기록하게하십시오. 그리고'time (NULL)'대신 seed를 지정하는 명령 행 스위치를 추가하십시오. – Medinoc

+0

이것은 시뮬레이션에도 편리합니다. – joshin4colours

4

시드는 의사 랜덤 넘버 생성기가 이전의 것과 다른 난수 시퀀스를 생성하기 위해 필요합니다 (항상 그런 것은 아닙니다). 반복되는 시퀀스를 원하지 않으면 의사 난수 생성 프로그램을 시드해야합니다.

이 코드를 사용하여 차이점을 확인하십시오. 씨없는
:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
     printf("%d", rand()%6 + 1); 
} 

씨앗과 :

같은 씨앗을 감안할 때
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
     srand(time(NULL)); 
     printf("%d", rand()%6 + 1); 
} 
25

, 같은 순서마다 생성하는 의사 난수 생성기. 그래서 당신이 달릴 때마다 다른 의사 난수 시퀀스가 ​​필요한지 아닌지에 달려 있습니다.

정말 귀하의 필요에 따라 다릅니다. 시퀀스를 반복하려는 경우가 있습니다. 네가하지 않을 때도. 각 특정 응용 프로그램의 요구 사항을 이해해야합니다.

당신이해서는 안되는 한 가지 일은 단일 서열의 생성 과정에서 반복적으로 씨앗입니다. 그렇게하면 시퀀스의 배포가 파괴 될 수 있습니다.

+0

씨앗의 의미는 무엇입니까? 나는 Google을 검색했고 대부분의 링크는 그것에 대한 설명을 제공하지 않습니다. –

+2

@Borat http://en.m.wikipedia.org/wiki/Random_seed –

+0

"단 하나의 시퀀스가 ​​생성되는 동안 반복해서 시드를하면 안됩니다. 그렇게하면 시퀀스 분포가 파괴 될 수 있습니다." 이유를 설명해 주시겠습니까? 매번 시드를하면 더 '무작위'가 될 것입니다. – Jose

12

일반적으로 난수 생성기라고하는 것은 실제로는 의사 생성기 넘버 생성기입니다. 이것은 일반적으로 "시드"라고하는 시퀀스에 "키"를 제공하면 동일한 임의의 시퀀스를 생성 할 수 있음을 의미합니다. 무작위 화에 기반한 알고리즘을 테스트하고 반복 가능한 결과를 보장해야 할 때 매우 유용합니다.

난수 생성기를 "시드"하지 않으면 기본적으로 (시스템 시간 기준) 난수로 시드가 지정되므로 프로그램을 실행할 때마다 다른 순서가 생성됩니다. C/C에서

1

++, 주사위 롤과 같은 시뮬레이션 될 것이다 :

int face = (rand() % 6) + 1); 
       ^
        |___________ Modulo operator 

% 6 5 통해 0으로 임의의 수를 제한하고 + 1이 범위를 상쇄되어, 그것이가되도록 1부터 6.

+0

OP는 Java에서'Math.random()'을 언급하며 0 사이의 부동 소수점 수를 반환합니다.0 및 1.0. –

+2

@ KlasLindbäck 해명 해줘서 고마워. 나는 내 대답을 편집했다. 내가 아는 C/C++에는'Math.random()'도 없습니다. –

1

난수 생성기는 실제로는 랜덤이 아닙니다. 즉, 12로 시드하고 100 개의 난수를 만들고, 프로세스를 반복하고 12로 다시 시드하고 100 개의 다른 난수를 만들면 동일합니다.

나는 즉시 생성 코드 뒤에, (12)의 씨앗을 각각 설명하기 위해 20 개 항목에서 2 개 실행의 작은 샘플을 첨부

:

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    srand(12); 
    for (int i =0;i<100; i++) 
    { 
     cout << rand() << endl; 
    } 
    return 0; 
} 

two randomly generated sequences both seeded with 12

은 반복을 피하기로 보다 고유 한 값을 사용하는 것이 일반적이며, 시간이 항상 변하기 때문에 무작위 시퀀스를 정확히 생성하는 두 프로그램의 가능성은 (특히 밀리 초 수준에서) 슬림하고 시간을 합리적으로 안전하게 사용할 수 있습니다. 거의 유일한 씨앗.

요구 사항 : 시드는 생성해야하는 고유 한 임의 시퀀스마다 한 번만 수행하면됩니다.

첫 번째 시퀀스가 ​​생성 된 정확한 시간을 알고 있으면 나중에 시드 값을 입력하여 정확한 시퀀스를 다시 생성 할 수 있습니다. 수동으로, 난수 생성기가 이전과 같은 방식으로 프로세스를 진행하도록합니다 (이것은 임의 시퀀스를 저장하는 데 대한 위쪽이고 임의성을 유지하기위한 단점입니다).