Gians (Normal User)
Newbie
Messaggi: 17
Iscritto: 12/08/2009
|
Ho qualche problema con una procedura ma non riesco a capire dove... in compilazione non ci sono errori ma eseguendo il programma a un certo punto si blocca e il ciclo repeat..until non si conclude. Ho pensato che il problema potesse risiedere nell'uso della funzione random, perché aggiungendo un writeln(extr), il valore estratto, prima di entrare nell'if, ho visto che vengono estratti sempre gli stessi 4 numeri. Ora, avendo impostato la cosa in modo che lo stesso numero non possa essere estratto più di 9 volte, e volendo ripetere il ciclo 54 volte, se si estraggono solo 4 numeri il programma si blocca per forza perché non possono essere estratti nuovi numeri e non si può raggiungere il 54.
Però, ho provato a creare un programma indipendente con la sola funzione random dichiarata nello stesso mod0, e lì non ci sono problemi, per cui... cosa posso aver sbagliato? Altra nota, prima la variabile extr era byte e in quel modo estraeva solo due numeri, la cosa mi sembra veramente molto strana... avete idee? Grazie mille per l'aiuto
Codice sorgente - presumibilmente Delphi |
procedure BuildCube; var rand_cube:cube; count,in_count,face:byte; extr_count:array[1..9] of byte; extr:integer; begin count:=0; in_count:=0; randomize; repeat extr:=random(8)+1; if extr_count[extr] < 9 then begin count:=count+1; writeln(extr); extr_count[extr]:=extr_count[extr]+1; if in_count=8 then face:=count div 9 else face:=(count div 9)+1; if in_count=9 then in_count:=1 else in_count:=in_count+1; { rand_cube.faces[face][in_count]:=extr;} end; until count > 53; end;
|
|
|
Anonymous (Member)
Guru
Messaggi: 1059
Iscritto: 30/07/2006
|
ho provato la procedura..... e sinceramente non mi son messo a contarli (ma presumo siano tutti).... però i numeri vengono stampati e dopo un po il ciclo finisce correttamente...
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Comunque c'è un errore, dovrebbe essere:
Codice sorgente - presumibilmente Pascal |
[...] If extr_count[extr] < 4 then [...]
|
inoltre i valori di extr_count non sono stati inizializzati.
Per la questione dei numeri casuali non saprei, mi sembra tutto a posto.
Ultima modifica effettuata da gigisoft il 13/08/2009 alle 23:02 |
|
Gians (Normal User)
Newbie
Messaggi: 17
Iscritto: 12/08/2009
|
ah avete ragione si, corretto l'errore va tutto a posto, grazie mille di nuovo. Tuttavia, il mistero rimane perché ieri, quando al posto del tipo array usavo direttamente l'array, la procedura era esattamente la stessa e funzionava... vabe', in ogni caso, grazie
|
|
Gians (Normal User)
Newbie
Messaggi: 17
Iscritto: 12/08/2009
|
Per tornare sull'argomento... vorrei dire che mi sembra di aver scoperto che la funzione random è alquanto imparziale... ho creato un ciclo infinito che può essere interrotto solo dall'estrazione casuale di un determinato valore; ebbene, il valore viene SEMPRE estratto alla PRIMA ripetizione del ciclo. Ciò non vi sembra... moralmente scorretto? >.<
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da Gians:
Per tornare sull'argomento... vorrei dire che mi sembra di aver scoperto che la funzione random è alquanto imparziale... ho creato un ciclo infinito che può essere interrotto solo dall'estrazione casuale di un determinato valore; ebbene, il valore viene SEMPRE estratto alla PRIMA ripetizione del ciclo. Ciò non vi sembra... moralmente scorretto? >.< |
mi pare strano, sei sicuro di aver usato la randomize? Inoltre con quel ciclo infinito prova a fare diverse prove, cambiando ogni volta il valore di uscita e ved che succede.
In generale ( come sapevo io ) in un intervallo di possibili valori la randomize rispetta abbastanza la distribuzione gaussiana di probabilità, che, al tendere all'infinito delle estrazioni dei numeri casuali, predilige i valori centrali rispetto a quelli agli estremi. |
|
Gians (Normal User)
Newbie
Messaggi: 17
Iscritto: 12/08/2009
|
Era sicuramente la randomize e avevo provato anche cambiando il valore più di una volta... ma era una prova che poi ho cancellato, ora ci ho riprovato e non succede più, non so cosa dovevo aver scritto...
|
|