pascal

Messaggioda Sirya88 » 25/09/2005, 16:12

buona domenica a tutti!
Frequento il quarto anno dello scientifico e mi trovo davanti a un programma che non ne vuol sapere di funzionare. Vi scrivo la traccia punto per punto e vi dico il problema che riscontro:
"Riempire un vettore A di 50 interi casuali compresi fra 1 e 100 tutti distinti."
Innanzitutto io ho usato la funzione random ma non so perchè mi dà numeri sempre uguali, quindi credo che sia già lì il problema. In ogni caso usando l'array gli chiedo che se a[i] è ugale a un altro numero i:=i-1 così me lo dovrebbe riscrivere ma mi sa che non vada bene neppure questo passaggio.
Chi può darmi una mano????? Grazie!
Sirya88
New Member
New Member
 
Messaggio: 1 di 90
Iscritto il: 24/09/2005, 16:24
Località: Italy

Messaggioda Rael » 25/09/2005, 16:26

Ciao, premetto che non sono proprio un gran esperto di pascal, ma programmo in C è assembler.
-per la funzione di generazione dei numeri pseudo-casuali "random" evidentemente ottieni ad ogni esecuzione gli stessi numeri a causa del fatto che la sequenza è fatta partire dallo stesso punto.
potresti risolvere il problema se trovi il modo di inizializzare la sequenza (in C, si fa con la funzione srand(int a), si passa un "seed" da cui la sequenza partirà scelto dall'utente) con l'ora interna del pc, mi sembra che il pascal implementi qualcosa del genere. Cmq puoi montare un generatore di numeri pseudo-random al volo, purchè ottenga l'ora interna del sistema (così poi non genera sempre gli stessi numeri ad ogni avvio ^_^)


Se ti restituisce un certo numero x,
per far si che sia compreso tra 1 e 100 fai (x%100)+1.

Per la seconda parte se non erro vuoi che il tuo array contenga 50 numeri interi pseudo-random, tutti diversi ?
Bene, per fare questo puoi fare due cose, o ti crei al volo un generatore di numeri casuali, che sei sicura dia sempre un numero diverso, o per ogni numero che trovi random, devi fare la ricerca lineare nell'array, e nel caso ci sia già, generare un numero random nuovo, quindi penso che per fare il tutto in modo più o meno decente dovresti trovarti con un for all'interno di un while.
1)generi il numero
2)cerchi nei numeri finora inseriti, se c'è già, rigeneri e ricerchi
se non c'è aggiungi ed incrementi l'indice.
3) ricomincia da 1
Rael
New Member
New Member
 
Messaggio: 78 di 87
Iscritto il: 08/10/2004, 21:23
Località: Italy

Messaggioda Rael » 25/09/2005, 16:43

Per la seconda parte puoi usare un "trucco" per farti venire dei numeri tutti diversi ^_^

generi un numero pseudo-random x

for i=0 to 49

a[i] := x + (random()%20)+1;
x := a[i];
i:= i+1;

dovrebbe funzionare se non volessi dei numeri tra 1 e 100, potresti provare ad aggiungere dei controlli sulla dimensione in modo da soddisfare anche questo requisito altrimenti si passa per la ricerca lineare ad ogni numero generato.

oppure altro trucco, questo forse più idoneo

x := 1

for i = 0 to 49

a[i]:= x+(random()%2)+1;
x := a[i];
i:= i+1;
Rael
New Member
New Member
 
Messaggio: 79 di 87
Iscritto il: 08/10/2004, 21:23
Località: Italy

Messaggioda Sirya88 » 25/09/2005, 17:28

il problema era in un particolare da me ignorato. Per il resto qualche correzione qua e là ma ora gira correttamente. Grazie dell'aiuto!!!! :D
Sirya88
New Member
New Member
 
Messaggio: 2 di 90
Iscritto il: 24/09/2005, 16:24
Località: Italy


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite