Newsgroup: it.comp.lang.c
Titolo: Generare numeri casuali

Ciao, ho un dubbio:
cosa vuol dire?
random() >> 6
E' uguale scrivere?
rand() >> 6
Il primo è scritto sotto linux, il secondo in visual c++.
Cosa sarebbe ">> 6" ?
Ciao.
Giacomo

 Cosa sarebbe ">> 6" ?
rand() e random(), come dice il nome delle funzioni, tornano un numero
pseudo-casuale in un intervallo prefissato. Le due funzioni
differiscono, se non sbaglio, solo per l'intervallo in cui puo' cadere
il numero casuale. Non so nulla di visual c++, ma ">> 6" dovrebbe
essere uno shift a destra di 6 posizioni, in questo caso operato sul
valore tornato da rand e random.
--
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it

 Reply to 
luca....@tiscalinet.it

 numero?
non sono sicuro al 100%, ma quando fai uno shift a sinistra di un numero
binario è come moltiplicarlo per 2, se "shifti" a sinistra dovresti dividere
per 2.
attendo conferme/smentite
Marco
--
Marco Coppo
University Of Sheffield
FAQ del gruppo: 
http://www.programmazione.it/linguaggi/c/itcomplangc.htm

 per 2.
Lo shift a sinistra moltiplica per 2
Lo shift a destra divide per 2... ma quest'ultimo non è del tutto portabile
e non funziona su alcune macchine.
--
________________________________
Togliete NoSpaM per rispondermi
bye Brain

 numero?
Operato su un intero, vuol dire dividere il numero per 2^6, quindi 64.


Operato su un intero, vuol dire dividere il numero per 2^6, quindi 64.
Considera che su molte macchine ((-1) >> 1) fa -1 mentre (-1 / 2) fa 0. In 
linea di massima per dividere e' meglio usare sempre la divisione perche' 
comunque il compilatore e' in grado di accorgersi se puo' ottimizzare qualcosa 
in modo "sicuro" (per es. nel caso di interi senza segno) ed eventualmente 
generare codice che utilizza lo shift invece della divisione.

Il giorno Thu, 09 Mar 2000 10:38:57 GMT, 
asc...@netscape.net
(Alessandro Scotti) ha scritto:

Ovviamente la x >> y da' un risultato esatto solo se x = k * (2^y),
con k intero.



Il problema non sta tanto nell'avere un unico bit settato, quanto nel fatto 
che se il bit di segno e' 1 e la variabile e' "signed" il bit di segno viene 
replicato, mentre se la variabile e' "unsigned" i bit che "entrano" dopo lo 
shift vengono messi a zero (cosi' se consideri numeri senza segno ottieni il 
risultato giusto, mentre se consideri numeri con segno bisogna fare un po' di 
attenzione se sono negativi perche' la divisione arrotondera' verso lo zero, 
mentre lo shift verso l'infinito negativo). In effetti dato che si tratta di 
due shift dal diverso comportamento e' il compilatore che sceglie quale usare 
in base al tipo della variabile: shift aritmetico se la variabile e' signed, 
shift logico se e' unsigned. In altre parole se ho:
        int a;
        unsigned b;
le espressioni (a >> 1) e (b >> 1) possono produrre codice diverso, per es. 
nel caso di un processore tipo 386:
        mov eax, [a]
        sar eax, 1
per (a >> 1), e:
        mov eax, [b]
        shr eax, 1
per (b >> 1), dove "sar" sta per Shift Arithmetical Right (preserva il segno) 
e "shr" per SHift (Logical) Right (i "nuovi" bit sono messi a zero).
P.S. Quanto detto vale se la rappresentazione interna dei numeri e' in formato 
"complemento a due", quello di gran lunga piu' utilizzato.