Newsgroup: it.comp.lang.pascal
Titolo: Random(n): troppo lento.

Sto facendo un gioco che richiede la scelta di una direzione a caso in
un set di quattro direzioni cosě definito:
Type TipoDirezione = (up, down, right, left, stop);
Var DirezPoss: Set of TipoDirezione;
Per fare ciň utilizzo questa funzione:
Function DirezioneRandom: TipoDirezione;
Var a: Integer; Appoggio: TipoDirezione;
Begin
Randomize;
Repeat
a:=Random(4);
Inc(a);
Case a of
       1: Appoggio:= up;
       2: Appoggio:= down;
       3: Appoggio:= right;
       4: Appoggio:= left;
       End;
Until Appoggio In DirezPoss;
DirezioneRandom:= Appoggio;
End;
Il problema č che credo che la funzione Random(n) sia troppo lenta per i
miei scopi, e infatti, se la uso troppo spesso nel mio prog. tutto il
gioco risulta molto rallentato.
Qualcuno di voi č in grado di creare una funzione che scelga un numero a
caso ma che sia piů veloce della classica Random(n)?
Aspetto fiducioso i vostri aiuti per migliorare il mio giochino...
Grazie da FABIO! :)

Non č proprio semplicissimo , potresti usare il timer con una funzione di
manipolazione...
In ogni caso non mi sembra che sia eccessivamente lenta. Io sto realizzando
un gioco che la usa circa 10/20 volte ogni 1/60 di secondo e funziona.
Magari specifica che computer hai.
Ciao !
andr...@libero.it

 
ci sono diversi modi... pero' di veloce non so.
Puoi provare con qualche algoritmo genetico, ma imho la random() e'
gia' buona di suo, ovvero il problema sta da un'altra parte.
bye!
-- 
Emanuele Cesena                 
http://www.penguinpowered.com/~ecesena
ece...@penguinpowered.com
                 Attenti all'antispam NOSPAM
Regole di Lewis:
        1.  Se ti dice di no, non crederci.
        2.  Se ti dice di si', non fidarti.

 gia' buona di suo, ovvero il problema sta da un'altra parte.
Sicuramente il prog. è già lento di per sé, (causa grafica e controlli vari)
ma ho notato che quel Random() ci mette il carico da 11! :-)
Come funziona quest'algoritmo genetico???
Ciao da FAIBO!
--
***---***
Fabio Feuli
E-Mail 
fe...@libero.it
"Considerate la vostra semenza:
fatti non foste a viver come bruti,
ma per seguir virtute e canoscenza"
(Dante: Inferno XXVI, 118-120)


http://www.penguinpowered.com/~ecesena
Ogni sera alla nove, mi dimentico che dopo sole tre ore e' gia'
mezzanotte.
		-- Doriano Blengino

 bye!
Bye, Mobius

 wrote:
Questa che ti sto per proporre č una piccola scemenza ma puň
funzionare...
all'inizio del programma crea una lista di ad esempio 200 numeri con
il random
dopo di che invec di usare il random ogni volta usalo ogni 20 volte
per decidere da che valore partire
e poi leggi i numeri in sequenza
ovvero:
genera la lista
usa il random e parte dal numero x
i numeri random sono nella lista agli indici x+1,x+2,x+3...x+20 della
lista
se arrivato a x+20 allora x:=random (250) e cosě via...
l'accesso alla lista dovrebbe essere molto veloce essendo solo un
accesso in memoria
Ciao
Kirys
--------------------------------------------------
Brayan Fix Kirys Solfory
E-Mail: 
Ki...@technologist.com
 
For Free Software go to: 
http://Kiryssoft.cjb.net


http://www.penguinpowered.com/~ecesena
Ufficiale della Commissione: "... Bene.  Perche' lei vuol fare
	l'obiettore di coscienza?".
Ragazzo chiamato alle Armi: "Perche' non potrei mai far male a nessuno".
Ufficiale: "A nessuno nessuno?".
Ragazzo: "A nessuno!".
Ufficiale: "Mmm...  E che mi dice di Vittorio Sgarbi?".
Ragazzo: "E' una domanda trabocchetto?".
		-- Greggio (il vignettista)

un set di quattro direzioni cosě definito:
random(4) non e' molto affidabile in termini di efficienza.
E' meglio allargare il range, cioe' scrivere, per esempio :
function OttieniNumeroCasuale : integer ;
var N : integer ;
begin
  N := random(4000) ;
  if N < 1000 then OttieniNumeroCasuale := 1
  else
  if N < 2000 then OttieniNumeroCasuale := 2 
  else
  if N < 3000 then OttieniNumeroCasuale := 3 
  else
     OttieniNumeroCasuale := 4 
  else
end ; 
In ogni caso a te conviene generare all'inizio del programma un
vettore di valori preimpostati (possibilmente 1000 o 10000) in modo
casuale e farlo "ruotare", avendo un indice nel vettore che avanza e
che ritorna a 1 quando il vettore finisce.
Di volta in volta, il valore v[i] e' il valore (falsamente) generato. 
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)