Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Random impazzito
Forum - Pascal - Random impazzito

Avatar
Gians (Normal User)
Newbie


Messaggi: 17
Iscritto: 12/08/2009

Segnala al moderatore
Postato alle 16:17
Giovedì, 13/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

  1. procedure BuildCube;
  2. var rand_cube:cube;
  3.     count,in_count,face:byte;
  4.     extr_count:array[1..9] of byte;
  5.     extr:integer;
  6.  
  7. begin
  8.   count:=0;
  9.   in_count:=0;
  10.   randomize;
  11.  
  12.   repeat
  13.     extr:=random(8)+1;
  14.     if extr_count[extr] < 9 then
  15.     begin
  16.       count:=count+1;
  17.       writeln(extr);
  18.       extr_count[extr]:=extr_count[extr]+1;
  19.       if in_count=8 then face:=count div 9
  20.         else face:=(count div 9)+1;
  21.       if in_count=9 then in_count:=1
  22.         else in_count:=in_count+1;
  23.      { rand_cube.faces[face][in_count]:=extr;}
  24.     end;
  25.   until count > 53;
  26. end;


PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1059
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 16:54
Giovedì, 13/08/2009
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...

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 17:56
Giovedì, 13/08/2009
Comunque c'è un errore, dovrebbe essere:
Codice sorgente - presumibilmente Pascal

  1. [...]
  2. If extr_count[extr] < 4 then
  3. [...]



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
PM Quote
Avatar
Gians (Normal User)
Newbie


Messaggi: 17
Iscritto: 12/08/2009

Segnala al moderatore
Postato alle 21:19
Giovedì, 13/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 :k:

PM Quote
Avatar
Gians (Normal User)
Newbie


Messaggi: 17
Iscritto: 12/08/2009

Segnala al moderatore
Postato alle 17:55
Martedì, 18/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? >.<

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 18:16
Martedì, 18/08/2009
Testo quotato

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.

PM Quote
Avatar
Gians (Normal User)
Newbie


Messaggi: 17
Iscritto: 12/08/2009

Segnala al moderatore
Postato alle 16:47
Domenica, 23/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...

PM Quote