2013-09-30 4 views
1
내가 랜드를 사용하지 않고 임의의 52 개 표준 카드를 제공 시뮬레이션 할

/부터 srand urandom의 등 ...생성 진정한 난수

이 내 난수 함수

int rand2(int lim) 
{ 
    static int a = 34; // could be made the seed value                
    a = (a * 32719 + 3) % 32749; 
    return ((a % lim) + 1); 
} 

구조체 난 것입니다 카드가 이미 터진 경우 알 (0 = NO, 1 예)

typedef struct   s_game 
{ 
    int     *cards; 
    int     state; 
    unsigned int   dat_rand; 
}      t_game; 

int    main() 
{ 
    t_game  game; 
    int   i; 
    int   rd; 

    i = 0; 
    game.cards = malloc(sizeof(*game.cards) * 52); 
    while(i < 52) 
    { 
     rd = rand2(52); 
     if(game.cards[rd] == 0) 
     { 
      game.cards[rd] = 1; 
      printf("i:%d\n rd: %d\n", i, rd); 
      i++; 
     } 
    } 
} 

하지만 내 출력이 항상 동일, 각각의 카드가 더 나은 랜덤 함수를 구경에게 너무 메신저 검색을 동시에 전달 또는 다른 내 배달을 채우기위한 방법

+2

귀하의 기능이 표준 기능보다 더 이상하다고 생각하게 만드는 요인은 무엇입니까? – JJJ

+3

인터넷 검색 ** [ "임의 번호 c"] (http://stackoverflow.com/questions/822323/how-to-generate-a-random-number-in-c) ** 결과가 없습니다. 나는 그걸 믿지 않는다. ... – ppeterka

+0

물론,하지만 내 자신의 임의의 기능을 원한다. – Saxtheowl

답변

6

숫자의 순서는 항상 동일 할 것이고 컴퓨터는이 수준에서 매우 결정적입니다.

발전기를 개선하려면 "발전기"를 사용하십시오. 컴퓨터의 현재 가동 시간은 고전적인 방법입니다. 물론 시드가 동일하면 동일한 시퀀스가 ​​생성됩니다.

더 좋은 해결 방법은 "cryptographically secure pseudorandom numbers"인데, 이는 C의 일부가 아니므로 일부 플랫폼을 유지하기 위해 뭔가해야합니다. 왜 당신이 "그것을 사용하고 싶지 않다"고 말하는 이유는 확실치 않습니다. 당신은 적당한 난수를 얻어야 만합니다.

또한 컴퓨터가 너무 결정적이기 때문에 "참"(또는 "좋은") 난수 생성은 꽤 어렵습니다. 특히 혼란 스럽기 때문에 C로 프로그래밍하는 것이 처음 인 것 같아서 개인적으로 해결할 것이라고 기대하는 것이 합리적이지 않습니다. 개인적으로 나는 내 자신의 보안 무작위를 굴리기 전에 오랫동안 주저 할 것입니다. 발전기.