2011-04-07 3 views
16

C에서 간단한 난수 생성기를 작성했습니다. 이 상한입니다. int l이 하한입니다.srand (time (NULL))은 시드 값을 빠르게 변경하지 않습니다.

잘 작동하지만 문제가 있습니다. 이 작업을 루프로 실행하면 time(NULL)은 정확하게 똑같은 일련의 난수가 연속적으로 나오지 않도록 시드 값을 빠르게 변경하지 않습니다.

다른 사람들이이 문제에 어떻게 접근했는지 궁금합니다. 온라인에서 찾은 모든 예제는 시드 값 생성기로 time(NULL)을 사용합니다.

int generateRandom(int l, int u) 
{ 
    srand(time(NULL)); 

    int r = rand() % ((u - l) + 1); 
    r = l + r; 

    return r; 
} 

내가 바로 옆에 서로 코드 줄을 실행했다면

, 모두 Rand1Rand2 정확히 같은 것이다.

printf("Rand1 = %d\n", generateRandom(10, 46)); 
printf("Rand2 = %d\n", generateRandom(10, 46)); 
+8

어! 변수 이름을 단순한 꾸밈없는'l '이라고하지 마십시오! 'lb','lower','lowerbound'를 선호합니다 ... – pmg

답변

19

srand(time(NULL))은 PRNG를 초기화하기 위해 정확히 한 번 실행해야합니다. 응용 프로그램이 시작되면 Main에서이 작업을 수행하십시오.

설명 :

PRNG (의사 난수 생성기)가 사용하는 알고리즘에 따라 숫자의 결정 시퀀스를 생성한다. 주어진 알고리즘은 항상 주어진 시작점 (시드)에서 동일한 시퀀스를 생성합니다. PRNG를 명시 적으로 시드하지 않으면 응용 프로그램이 실행될 때마다 동일한 기본 시드 (seed)에서 시작되어 동일한 번호 순서가 사용됩니다.

이 문제를 해결하려면 응용 프로그램을 실행할 때마다 다른 시드를 사용하여 PRNG를 시드해야합니다. 일반적인 접근법은 time(NULL)을 사용하여 현재 시간을 기준으로 시드를 설정하는 것입니다. 서로의 애플리케이션 인스턴스를 두 번 시작하지 않는 한 서로 다른 임의의 순서가 보장됩니다.

새로운 난수가 필요할 때마다 시퀀스를 시드 할 필요가 없습니다. 그리고 이것에 대해서는 잘 모르겠지만, PRNG 알고리즘에 따라 새로운 숫자마다 다시 시드 (seeding)를 사용하면 실제로 결과 시퀀스의 난수가 더 낮아질 수 있습니다.

+2

최소한 재 시술은 상처를주지 않았더라도 품질에 도움이되지 않습니다. 매번'time (NULL) '에서 파종하는 경우에는 어떤 작업을하는지 알 수 있습니다. –

7

주초의 시작 부분에 한 번 종자. 같은 초 동안에 너무 빨리 다시 채우면 결국 같은 번호를 얻게 될 것입니다.

5

프로그램의 시작 부분에만 매번 시드하지 마십시오.

또한 C-lib 표준 무작위 기능 사용에 대한 많은 서적 조언. 좋은 pseudo-random number가 필요하다면, Press 등의 Numerical Recipes, 3rd에 좋은 알고리즘이 있습니다. 판.

+0

NR에주의하십시오. 책의 코드에 대한 사용권 조항은 매우 부담 스럽습니다. 입력하면 기본적으로 버전 제어 또는 네트워크 파일 저장이 금지됩니다. – Flexo

4

다른 함수 (main)에서 generateRandom 함수를 호출한다고 가정합니다.

함수 내에 시드를 선언하면 함수가 재설정됩니다. 기능을 재설정하면 같은 번호가 여러 번 나타날 것입니다.

주 기능으로 srand(time(NULL));을 이동하면 문제가 해결됩니다.

1

서로 다른 프로세스를 사용하는 경우, 당신이 랜드 번호를 한 경우, (두 번째 랜덤 값으로 여러 번 같은 프로그램을 테스트 프로그램을 종료하고 매우 빠른 다시 실행하는 데 사용할 (rand()+getpid())%range; 을 사용, 숫자가 될 것입니다 짧은 사이클 테스트를 포함)

4

srand((unsigned) time(NULL) * getpid());

는 OSX 10.8 (보다 다양한 임의의 세트를 산출한다) 동일.

+0

OS X 10.8에서 임의성을 염려한다면'arc4random()'또는'arc4random_uniform()'을 사용해야합니다. – dreamlax

관련 문제