2013-06-19 8 views
2

내 코드는 포인터를 임의의 이름으로 초기화합니다. 임의의 이름은 rand 함수를 사용하여 무작위로 선택됩니다.랜드 기능 향상

나는 rand 함수가 내가 원하는 것을하지 않는다는 것을 알아 차렸다. 다음 코드에서는 동일한 이름의 모든 포인터를 초기화합니다! 나는 이것이 시간 기능에 대한 선택을 근거로 한 rand 함수로 할 수 있다고 생각한다. 한 번에 모든 포인터를 초기화하면 동일한 난수가 생성됩니다. 타임 스탬프가 다른 번호를 생성하는 데 시간이 걸릴 것이라고 확신합니까? 루프에서 초기화를 실행하여 코드를 수정할 수 있지만 때로는 루프를 통과하는 데 몇 초가 걸리기 때문에 수정해야 할 다른 방법을 알고 싶습니다. 참고로

:

+6

'rand()'를 호출하기 전에 시드하지 마십시오. 프로그램 시작시'srand'를 한 번 호출하십시오. – Anthony

+1

더 의미있는 변수 이름을 사용하는 것도 고려하십시오. – icedwater

+0

필자는 최종 프로그램에서 훨씬 의미있는 변수 이름을 사용합니다. 그리고 그것들이 짧고 무의미한 이유는 그들이 100 번 사용하기 때문에 코멘트가없고 짧아야하기 때문입니다. 그러나 나는 변수가 좋은 이름을 가져야한다고 생각한다. – Samuel

답변

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

int random_number(int, int); 
const char *random_name(); 
//---------------------------------------------------------------- 
int main(void) 
{ 
    const char * kg = NULL; 
    const char * ke = NULL; 
    const char * dg = NULL; 
    const char * de = NULL; 

    kg = random_name(); 
    ke = random_name(); 
    dg = random_name(); 
    de = random_name(); 

    printf("kg=%s\nke=%s\ndg=%s\nde=%s\n", kg, ke, dg, de); 

    return 0; 
} 
//---------------------------------------------------------------- 
const char *random_name(int x) 
{ 
    const char *names[7] = 
    {"Bob", "Billy", "Buck", "Bobby", "Bill", "Billy Bob", "Bobi"}; 

    int roll = random_number(0,7); 
    return names[roll]; 
} 
//---------------------------------------------------------------- 
int random_number(int min, int max) 
{ 
    int roll; 
    int maximum = max - min; 
    srand(time(NULL)); 
    roll = (rand() % maximum) + min; 
    return roll; 
} 
rand()

함수는 다음 값을 계산하기 위해 이전 세대를 사용하는 의사 난수 생성기이다. srand()으로 시드를하면 시작 값이 설정되고 여러 번 수행하면 효과적으로 난수 시퀀스가 ​​'재설정'됩니다. rand()을 호출하기 전에 프로그램 시작시 한 번 (srand() 사용) 난수 생성기를 시드하십시오.

2

메인 방법으로 srand(time(NULL))으로 이동하십시오. 그러면 난수 생성기가 프로그램의 진입 점에 시드되어 나머지로부터 균등 분포가있는 다른 임의의 숫자를 rand()이 호출 될 때마다 검색 할 수 있습니다.

2

필자는 PRNG에 대한 각 호출마다 각 실행에 새로운 값을 입력한다는 사실에 문제가 있다고 생각합니다. 뭔지 봐 srand() does here. 각 호출에 PRNG 시드를 피하기를 원하는 이유는 rand()에 대한 다음 호출에서 생성 된 값이 균등하게 분산되도록 보장 할 수 없기 때문입니다. 가장 가능성있는 것은 값의 분포가 균일하고 이런 식으로 srand()을 사용하면 예기치 않은 결과가 발생한다는 것입니다. This answersrand()으로 한 번 전화해야하는 이유에 대해 자세히 설명합니다.

또한 유사한 규칙이 어떤 언어로 어떤 PRNG에 적용되는 것이며, 다만 C.

2

프로그램이 너무 time가 호출 될 때마다 같은 값을 반환 매우 빠르게 실행 명심. srand에 전달 된 값 (s은 "시드"를 의미 함)은 rand이 생성 할 시퀀스를 결정하므로 동일한 프로그램 실행 내에서 매번 동일한 번호 (초기 번호 또는 그렇지 않은 임의 순서)를 생성하지만 번호는 나중에 프로그램을 다시 실행할 때 달라집니다.

다른 솔루션에서 언급했듯이 main의 시작 부분에 srand을 대신 호출해야합니다.

+0

OP가 왜 "같은 이름!"인지 설명하는 +1. – chux