rand () devuelve el mismo valor después de la primera vez

Primero, aquí está mi código:

#include  #include  #include  #include  #define NUM_SUITS 4 #define NUM_RANKS 13 bool in_hand[NUM_SUITS][NUM_RANKS] = {false}; bool newcard = {false}; int num_cards, rank, suit, totrank; const char rank_code[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K',}; const char suit_code[] = {'C','D','H','S'}; int main_hand () { suit = rand() % NUM_SUITS; rank = rand() % NUM_RANKS; if (!in_hand[suit][rank]) { in_hand[suit][rank] = true; num_cards--; if (suit == 0){ printf("%c of Clubs \n", rank_code[rank]); } else if (suit == 1){ printf("%c of Diamonds \n", rank_code[rank]); } else if (suit == 2){ printf("%c of Hearts \n", rank_code[rank]); } else if (suit == 3){ printf("%c of Spades \n", rank_code[rank]); } } } int print_hand (suit) { } int totrank_check (totrank) { if (totrank > 21) { printf ("You lose!"); } else if (totrank == 21) { printf ("You win!"); } } int main() { bool stay = {false}; srand((unsigned) time(NULL)); totrank = 0; num_cards = 2; printf("Your hand: "); while (num_cards > 0) { main_hand(); totrank = totrank + (rank + 1); } printf("Total rank: %d\n", totrank); totrank_check(totrank); printf("\n"); while (totrank < 24 && stay == false) { printf("Another card? 1. Yes 0. No\n"); scanf("%d", &newcard); if(!newcard) { main_hand(); } totrank = totrank + (rank + 1); totrank_check(totrank); printf("Total rank: %d\n", totrank); printf("Stay? 1. Yes 0. No\n"); scanf("%d", &stay); } return 0; } 

Básicamente es un código que “simula” y la mano del blackjack. Comienza, rand() elige dos números, el rango y el palo de las cartas, que se establecen como verdaderos en una matriz para que no puedan ser elegidos nuevamente en la misma combinación y luego imprimirse. Hay un cheque para el rango total de las cartas (de modo que si supera las 21, pierdes automáticamente) y luego se te pregunta si quieres otra carta o si quieres quedarte.

Aquí está el error: si eliges que quieres otras cartas, esta nueva será la misma que la anterior. Básicamente, obtienes un As of Spades, the y Two of Diamonds, luego quieres otra carta y obtienes otra Two of Diamonds. Y el otro, y otro. Si eliminas la verificación de rango en el segundo mientras puedes ver que el rango aumenta según el rango de la última carta.

Antes, los printfs estaban en esa función print_hand() , y se podía ver que siempre tenía la misma tarjeta, ahora los moví en la función main_hand() porque pensé que podría ser el problema (no fue así) y Porque tener una función separada para la impresión era redundante. Pero se puede ver que técnicamente, el if(!in_hand[suit][rank]) funciona, porque, dado que la tarjeta es la misma, no ingresa el if y no se imprime.

No sé qué está causando este problema. ¿Alguna idea?

Tenga en cuenta que ya estoy usando srand((unsigned) time(NULL)); para sembrar rand() .

scanf("%d", &newcard); y scanf("%d", &stay); son un problema ya que las variables son bool , pero el especificador de formato es para int . En 2 lugares, cambiar como:

 // scanf("%d", &newcard); int t; scanf("%d", &t); newcard = !!t; 

3 funciones devuelven int pero no devuelven nada. Cambiar a anular funciones.

 // int main_hand() { void main_hand() { 

Parece que hay otros problemas de lógica también.
1) El código a veces existe sin saber si ganado / pérdida
2) Comentario de @Jongware arriba correcto:

Por último: si sigue apareciendo la misma secuencia aleatoria, elimine el código a un main srand time printf rand y descubra si funciona. time() , si no funciona siempre devuelve -1.
O simplemente agregue lo siguiente y verifique srand() llamado con diferentes valores.

  int main(void) { unsigned now = (unsigned) time(NULL); printf("now = %u\n", now); srand(now);