PDA

View Full Version : [c] Problema numeri random


Eduadie
21-02-2013, 11:29
Salve a tutti ragazzi, avrei un problema nel programma in c che ora vi riporto.
Credo che il problema sia con la funzione srand() poichè in questo programma creato dovrei generare 5 basi di un triangolo di carte con numeri compresi tra 1 e 15, solo che queste 5 basi sono tutte uguali...Questo è il main del programma:

/*
Algoritmo che controlla se da un array di 5 interi generati a caso è possibile costruitire un triangolo di carte.
Il gioco richiede che ogni carta sia la differenza tra le due carte che le stanno immediatamente sotto, a sinistra e a destra.
E' possibile utilizzare 15 carte.
Inputs:
Outputs:
Costrutti Ripetitivi:
Complessità di tempo:
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "function.h"

int algoritmo (int esecuzione);

void main()
{
int i;
int testMassimi = 5; //Test per la verifica dell'algoritmo

for(i=0;i<testMassimi;i++)
{
if(algoritmo(i) == 1) //Esce se si ottiene un successo
{break;}
}
}

/*Algoritmo*/
int algoritmo (int esecuzione)
{
/*Definizioni variabili*/
int i,j, nuovo;
int successo=0;
int numeroCarte, differenza;
int matrice[BASE][BASE];
int dobreak = 0;

/*Conto le carte*/
numeroCarte = contaCarte(BASE);


for(i=0;i<BASE;i++)
{
for(j=0;j<BASE;j++)
{
matrice[i][j] = 0;
}
}

/*
//Valori immessi a mano per testare l'esempio del prof
matrice[0][0] = 6;
matrice[0][1] = 14;
matrice[0][2] = 15;
matrice[0][3] = 3;
matrice[0][4] = 13;
*/

/*Inserisco il primo valore nella matrice alla base, valore compreso tra 1 e 15*/
srand(time(NULL));
matrice[0][0] = 1 + rand() % numeroCarte;

/*Riempio la base della matrice con altri valori, passandoli per la funzione isPresent per verifare se sono già presenti*/
for(j=1;j<BASE;j++)
{
nuovo = 1 + rand() % numeroCarte;
while (isPresent(matrice,nuovo) != 0)
{
nuovo = 1 + rand() % numeroCarte;
}
matrice[0][j] = nuovo;
}

/*
for(i=0; i<BASE; i++)
{
for(j=0;j<BASE;j++)
{
if(matrice[i][j] != 0)
printf("%3d", matrice[i][j]);
}
printf("\n");
}
*/

/*Calcola le carti successive dopo aver generato la base, terminandolo se si presenta una carta già presente (isPresent)*/
for (i=1;!dobreak && i<BASE;i++)
{
for(j=0;j<BASE - i;j++)
{
differenza = abs(matrice[i-1][j] - matrice[i-1][j+1]);
if(isPresent(matrice, differenza) != 0)
{
printf("Esecuzione: %d; la Carta %d ottenuta dalle carte %d e %d e' gia' presente\n", esecuzione, differenza, matrice[i-1][j], matrice[i-1][j+1]);
dobreak = 1;
break;
}
matrice[i][j] = differenza;
}
}

/*Se ho completato tutto(matrice triangolare inferiore) ho avuto successo*/
if(matrice[BASE-1][0] != 0)
{
printf("Esecuzione: %d; le Carte generate sono tutte diverse tra loro ed e' possibile costruire il triangolo\n", esecuzione);
successo = 1;
stampaTriangolo(matrice);
}

return successo;
}
Dove potrebbe essere il problema? Mi genera 5 basi di numeri tutte uguali...
Ho anche un altro file function.h, ma credo che il problema sia qui...con il seed della funzione srand o qualcosa del genere...qualcuno sa aiutarmi?
Grazie

wingman87
21-02-2013, 12:03
Sì, credo che il problema sia srand. Il fatto è che, giustamente, inizializzi il seed a time(NULL), però questa chiamata, siccome passa troppo poco tempo tra un'esecuzione della funzione "algoritmo" e un'altra, restituisce sempre lo stesso valore.
Per risolvere metti l'istruzione srand nel main, prima del ciclo for.

Eduadie
21-02-2013, 12:34
Molto gentile wingman, ho risolto perfettamente nel tuo modo.
Grazie ancora! :)

Altra cosa se non ti dispiace:

io ho una struct definita in un altro file.
Nel main ho una parte di programma che mi crea un prodotto secondo quella struct:
prodotto1.codice = 000;
prodotto1.nome = "prodotto1";
prodotto1.desc = "descrizione";
prodotto1.costo = 30;
prodotto1.sconto = 10;

Ora vorrei mostrare a video nome e desc, ma se lo faccio con puts non ci riesco, mi manda a video dei caratteri strani...Come posso fare?