Oppure

Loading
13/08/09 14:17
Gians
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 :)


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;
aaa
13/08/09 14:54
Anonymous
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...
aaa
13/08/09 15:56
gigisoft
Comunque c'è un errore, dovrebbe essere:
[...]
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 13/08/09 21:02
aaa
13/08/09 19:19
Gians
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:
aaa
18/08/09 15:55
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? >.<
aaa
18/08/09 16:16
gigisoft
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.
aaa
23/08/09 14:47
Gians
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...
aaa