View Full Version : [pascal] randomize.
Sapete di preciso la funzione di randomize in tale estinto linguaggio di programmazione?
ho fatto un esperimento con sto programmetto:
program randomiziamo;
uses crt;
var a,b,c,d,e,f:real ;
BEGIN
clrscr;
repeat
begin
randomize;
b := random; { esce un numero reale compreso fra 0 e 1 }
c := random(12); { esce un numero intero compreso fra 0 e 1 }
d := 12+random; { esce un numero reale compreso fra 12 e 13 }
e := 2 + (5-2)*random; { esce un numero reale compreso fra 2 e 5 }
a := a + 1 ;
f := random; { esce un numero reale compreso fra 0 e 1 }
writeln(' ciclo numero ',a:2:0);
writeln('b = ',b:8:4);
writeln('c = ',c:8:4);
writeln('d = ',d:8:4);
writeln('e = ',e:8:4);writeln('f = ',f:8:4);writeln;
end
until a >= 5;
repeat until keypressed;
end.
e ho notato che all'interno dei cicli rende le variabili di tali cicli una costante a random. Mi spiego... se b:= random(10) viene 7 allora tutte le volte che verrà eseguito il ciclo la variabile b varrà sempre e solo 7.
Mi sembra strana una funzione del genere... sapete dirmi come funziona esattamente? ed eventualmente per cosa viene usata? O_o
Ziosilvio
12-10-2004, 21:51
Originariamente inviato da kibuzo
all'interno dei cicli rende le variabili di tali cicli una costante a random. Mi spiego... se b:= random(10) viene 7 allora tutte le volte che verrà eseguito il ciclo la variabile b varrà sempre e solo 7.
Se funziona come negli altri linguaggi, il generatore pseudorandom del Pascal si basa sull'applicazione successiva di una trasformazione a partire da un valore iniziale detto seme.
La chiamata a randomize inizializza il seme con un valore particolare; le varie chiamate a random calcolano il valore della trasformazione sul seme, sostituiscono il valore del seme con quello calcolato, e restituiscono il valore calcolato.
Il problema è che randomize deve permetterti sia di inizializzare il seme sia con un valore che dici tu (o prefissato), per poter ripetere esattamente un esperimento; sia di inizializzarlo con un valore "preso a caso" (es. l'ora di avvio del programma) per avere comportamenti diversi a ogni esecuzione.
A quanto pare, chiamando randomize senza argomenti, si ottiene il primo comportamento; e a te interessa il secondo.
Qui però non ti so aiutare, anche perché non ricordo nemmeno se il Pascal standard prevede o no un generatore pseudorandom; leggi bene cosa dice il manuale del compilatore.
motogpdesmo16
12-10-2004, 21:51
reminescenze del 3° anno (ossia 2 anni fa)...
dunque come prima cosa ti consiglio di mettere randomize all'esterno del ciclo repeat..until perchè è una funzione che serve come " a far girare il contenitore dei numeri casuali" (hai presente la tombola quando colui che ha il tombolone agita il sacchettino con i numeri...bene...immagina che sia l'attivazione del movimento del sacchettino). E forse proprio per questo motivo hai risultati inaspettati.
poi veniamo alla valorizzazione delle variabili
b := random; { esce un numero reale compreso fra 0 e 1 }non ricordo si potesse mettere random senza specificare l'intervallo
c := random(12); { esce un numero intero compreso fra 0 e 1 }dovrebbe generare numeri casuali tra 0 e 11 ossia i primi 12 interi;
d := 12+random; { esce un numero reale compreso fra 12 e 13 }vedi prima motivazione
e := 2 + (5-2)*random; { esce un numero reale compreso fra 2 e 5 }vedi prima motivazione
a := a + 1 ;una semplice variabile contatore che non dovrebbe destare preoccupazioni
f := random; { esce un numero reale compreso fra 0 e 1 }
solita prima motivazione
non ho il pascal installato su questo pc, altrimenti l'avrei visionato ben volentieri.
prendi con la dovuta cautela le mie motivazioni relative a random senza specificare l'intervallo, anche perchè questa funzione mi è capitata di usarla una volta sola quando feci un programma che simulava il gioco del master mind.
ghiotto86
12-10-2004, 21:52
Originariamente inviato da kibuzo
Sapete di preciso la funzione di randomize in tale estinto linguaggio di programmazione?
ho fatto un esperimento con sto programmetto:
e ho notato che all'interno dei cicli rende le variabili di tali cicli una costante a random. Mi spiego... se b:= random(10) viene 7 allora tutte le volte che verrà eseguito il ciclo la variabile b varrà sempre e solo 7.
Mi sembra strana una funzione del genere... sapete dirmi come funziona esattamente? ed eventualmente per cosa viene usata? O_o
infatti quello che hai detto tu è quello che fa la random.
senza però la randomize (rimescolamento) prima il valore della variabile è costante.
a questo serve randomize.
n.b.:che feccia di linguaggio però molto didattico.
ciauz
motogpdesmo16
12-10-2004, 21:53
Originariamente inviato da ghiotto86
...cut....
n.b.:che feccia di linguaggio però molto didattico.
ciauz
anche io due anni fa dicevo che era un brutto e inutile linguaggio. 2 anni dopo col senno del poi, penso mi sia servito.
Un po' come il latino. Nessuno lo parla più oggi, ma ti apre la mente.
beppegrillo
12-10-2004, 22:40
Originariamente inviato da motogpdesmo16
anche io due anni fa dicevo che era un brutto e inutile linguaggio. 2 anni dopo col senno del poi, penso mi sia servito.
Un po' come il latino. Nessuno lo parla più oggi, ma ti apre la mente.
Infatti è ancora molto utilizzato per la didattica, imho è molto valido in quel campo.
Ti permette di focalizzare le idee sugli aspetti generali della programmazione senza farti svenare troppo ad imparare cose complesse, tanto una volta acquisito il modus operandi diventa facile passare a linguaggi sicuramente più professionali ed utili. :)
motogpdesmo16
13-10-2004, 12:54
Originariamente inviato da beppegrillo
Infatti è ancora molto utilizzato per la didattica, imho è molto valido in quel campo.
Ti permette di focalizzare le idee sugli aspetti generali della programmazione senza farti svenare troppo ad imparare cose complesse, tanto una volta acquisito il modus operandi diventa facile passare a linguaggi sicuramente più professionali ed utili. :)
e hai ragione. Infatti con il visual basic, seppure orientato ad oggetti, mi sono trovato bene.
ghiotto86
13-10-2004, 13:12
Originariamente inviato da motogpdesmo16
e hai ragione. Infatti con il visual basic, seppure orientato ad oggetti, mi sono trovato bene.
vabbè il visual basic è un linguaggio aprticolare come il delphi (non proprio così) che sono like pascal.
studiando il c o c++ invece vedi che sono molto + complessi e utili.
anchio agli inizi grazie al pascal ho imparato a programmare, ma penso che le scuole dovrebbero iniziare direttamente col C.
per poi pèassare o al c++ o al java.
N.b: il visual basic non è orientato ad oggetti, ho capito come intendi tu ma quelli sono oggetti già belli e fatti.
in c++ è diversi: lo devi creare tu un command button.
+ che altro il visual basic è un linguaggio ad EVENTI.
ciau
motogpdesmo16
13-10-2004, 13:18
Originariamente inviato da ghiotto86
vabbè il visual basic è un linguaggio aprticolare come il delphi (non proprio così) che sono like pascal.
studiando il c o c++ invece vedi che sono molto + complessi e utili.
anchio agli inizi grazie al pascal ho imparato a programmare, ma penso che le scuole dovrebbero iniziare direttamente col C.
per poi pèassare o al c++ o al java.
N.b: il visual basic non è orientato ad oggetti, ho capito come intendi tu ma quelli sono oggetti già belli e fatti.
in c++ è diversi: lo devi creare tu un command button.
+ che altro il visual basic è un linguaggio ad EVENTI.
ciau
mi hanno sempre detto che il visual basic è un linguaggio "object oriented" oppure "event driven".
Il c++ lo studiamo (si fa per dire) in sistemi, utilizzando la comunicazione fra le porte ecc.
Sono comunque d'accordo anche io che già in 3a superiore bisogna studiare il linguaggio c++.
ehm... stiamo andando ot....
quello che ho notato è ke il randomize se inserito all'interno di un ciclo in tale ciclo assegna sempre lo stesso valore random a una variabile, mentre se non è all'interno del ciclo no, e questo mi pare strano xke tutte le volte che com incia il ciclo dovrebbe ripetere le operazioni daccapo. Non può essere una coincedenza, no.
esempio... while j<2000 do
begin
randomize;
clrscr;
b:=random
writeln('numero = ',b,'');
end;
qua dentro mi scrive sempre numero = 0,98686489.... vi rendete conto? per tutte e 2000 le volte....
Dragonx21
14-10-2004, 18:38
Originariamente inviato da kibuzo
ehm... stiamo andando ot....
quello che ho notato è ke il randomize se inserito all'interno di un ciclo in tale ciclo assegna sempre lo stesso valore random a una variabile, mentre se non è all'interno del ciclo no, e questo mi pare strano xke tutte le volte che com incia il ciclo dovrebbe ripetere le operazioni daccapo. Non può essere una coincedenza, no.
esempio... while j<2000 do
begin
randomize;
clrscr;
b:=random
writeln('numero = ',b,'');
end;
qua dentro mi scrive sempre numero = 0,98686489.... vi rendete conto? per tutte e 2000 le volte....
allora,
per rispondere a tutti.
la funzione random può essere utilizzata da sola cioè
a:=random
e la procedura randomize va messa una sola volta all'inizio del programma, non dentro un'iterazione.
ciao!
si quello l'avevo capito ankio...
il perchè xo è oscuro ai più... e il prof ci ha invitati a scoprirlo... è una settimana che cerco ovunque... e mo ho kiesto qua.
motogpdesmo16
14-10-2004, 18:50
Originariamente inviato da kibuzo
si quello l'avevo capito ankio...
il perchè xo è oscuro ai più... e il prof ci ha invitati a scoprirlo... è una settimana che cerco ovunque... e mo ho kiesto qua.
ribadisco quello che ho detto nel primo mio reply. Penso si tratti della chiamata di una function predefinita pascal che ha il compito di mettere in movimento il meccansimo di generazione dei numeri casuali.
Un esempio calzante a mio parere è quello del sacchettino della tombola, sempre presente nel mio reply.
abbi pazienza...
quello che mi sembra di aver capito è che il randomize si "prende il sacchetto della tombola" e poi coi random comincia a tirare numeri a caso... q eui correggimi se sbaglio.
Ma in un sacchettino della tombola c'è un numero solo? mi pare alquanto strano che venga SEMPRE lo STESSO numero
motogpdesmo16
14-10-2004, 19:04
si, hai ben compreso l'esempio del sacchettino della tombola.
Quello che volevo dire io, era la risposta alla 2a parte
il perchè xo è oscuro ai più... e il prof ci ha invitati a scoprirlo... è una settimana che cerco ovunque... e mo ho kiesto qua.
questa frase penso si riferisse a questa frase di Dragonx21:
e la procedura randomize va messa una sola volta all'inizio del programma, non dentro un'iterazione
se non è così, mi scuso per l'incomprensione.,
ciao
ok, adesso che ci siamo messi d'accordo vediamo di chiarire il problema:
visto che lui col randomize prende il sacco della tombola, perchè se lo metto all'inizio di ogni ciclo ad una variabile a cui assegno un valore random all'interno del ciclo mi assegna sempre lo stesso valore?
non dovrebbe prendere un "sacchetto nuovo" ogni volta?
ghiotto86
14-10-2004, 20:02
Originariamente inviato da kibuzo
ok, adesso che ci siamo messi d'accordo vediamo di chiarire il problema:
visto che lui col randomize prende il sacco della tombola, perchè se lo metto all'inizio di ogni ciclo ad una variabile a cui assegno un valore random all'interno del ciclo mi assegna sempre lo stesso valore?
non dovrebbe prendere un "sacchetto nuovo" ogni volta?
preso dall'help del turbo pascal:
inizialzates the built-in random number generator witch a random value (obtained form system colck).
.
.
.
the random number generator should be inizialized by making a call to Randomize, or by assigning a value to Randsend.
richiamando sempre la randomize nel ciclo dovrebbe andare bene (infatti se fai il debug uscirà penso la sequenza casuale, prova), ma devi fare un'inizializzazione fuori dal ciclo.
il pascal è un po rognoso su ciò, quindi non ti fare sti problemi.
p.s: per le cose che ho scritto in inglese se non lo sapete IMPARATELO
:D
ciauz
Originariamente inviato da ghiotto86
preso dall'help del turbo pascal:
inizialzates the built-in random number generator witch a random value (obtained form system colck).
.
.
.
the random number generator should be inizialized by making a call to Randomize, or by assigning a value to Randsend.
richiamando sempre la randomize nel ciclo dovrebbe andare bene (infatti se fai il debug uscirà penso la sequenza casuale, prova), ma devi fare un'inizializzazione fuori dal ciclo.
il pascal è un po rognoso su ciò, quindi non ti fare sti problemi.
p.s: per le cose che ho scritto in inglese se non lo sapete IMPARATELO
:D
ciauz
i problemi sono che
a) non ho il turbo pascal ma il freepascal, mi pare cmqw chiaro che nn posso accedere all'help.
b) nn sono seghe mentali mie ma del mio prof =P
quindi il problema resta sempre PERCHE' non lo posso mettere all'interno del ciclo?
ghiotto86
14-10-2004, 22:14
Originariamente inviato da kibuzo
i problemi sono che
a) non ho il turbo pascal ma il freepascal, mi pare cmqw chiaro che nn posso accedere all'help.
b) nn sono seghe mentali mie ma del mio prof =P
quindi il problema resta sempre PERCHE' non lo posso mettere all'interno del ciclo?
io penso che sia uno standard del pascal: devi inizializzare sta randomize fuori da ciclo e basta.
una spiegazione forse è che randomize rieseguite n volte nel ciclo forse ha un valore impostato che non cambia.
40
BHOOO
Dipende da come è implementata randomize...potrebbe generare il seme in base all'orologio di sistema... Essendo il ciclo eseguito velocemente inizializza il generatore pseudorandom ogni volta con los tesso seme...e quindi una chiamata a random con lo stesso seme genera sempre lo stesso numero ;)
In generale la randomize o la srand in C (che non a caso si inizializza con l'orologio di sistema) va chiamata una sola volta all'interno di tutto il programma...
ghiotto86
15-10-2004, 14:08
Originariamente inviato da cionci
Dipende da come è implementata randomize...potrebbe generare il seme in base all'orologio di sistema... Essendo il ciclo eseguito velocemente inizializza il generatore pseudorandom ogni volta con los tesso seme...e quindi una chiamata a random con lo stesso seme genera sempre lo stesso numero ;)
In generale la randomize o la srand in C (che non a caso si inizializza con l'orologio di sistema) va chiamata una sola volta all'interno di tutto il programma...
infatti era questo che volevo dire
siiii adesso o capito.... grazie a tutti!
da parte della 4° CD :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.