Newsgroup: it.comp.lang.c++
Titolo: Lvalue required...

salve ragazzi,
ho il seguente programmino "test" :-)
#include <stdlib.h>
#include <iostream>
int main(){
RAND_MAX=20;  // qui mi becco l'errore Lvalue required
randomize();
cout << rand();
system ("pause");
return 0;
}
perchè mi appare l'errore? purtroppo la guida del borland a proposito di
RAND_MAX non mi dice come devo assegnare il valore! :-((
scusate per la banalità della domanda!
ivan

 RAND_MAX non mi dice come devo assegnare il valore! :-((
non lo devi/puoi assegnare perche' e' una costante !!
Probabilmente e' il valore massimo di un valore generato dalla
rand() (tipicamente il massimo intero su 2 o 4 bytes o giu' di li').
(Non ho sottomano il Borland).
Cioe' da qualche parte in stdlib.h
avrai una
#define RAND_MAX 32767
o simile, quindi....
Se vuoi ottenere numeri rand tra 0 e 19 la strada e' un'altra...
ciao,
g.

"Giovanni Resta" <g.r...@iit.cnr.it.nospam> ha scritto nel messaggio
news:3E53E56C...@iit.cnr.it.nospam...
CUT CUT CUT
| Se vuoi ottenere numeri rand tra 0 e 19 la strada e' un'altra...
| ciao,
|
immaginavo di aver scelto la strda sbagliata.... :-(((
ehi, mica potresti darmi un'indicazione? :-)
grazie cmq!
ivan

, 
dromeda...@inwind.itDELETE says...

prova a usare (rand()%20) invece che rand()
Bye!


Perfetto. Naturalmente se vuoi numeri da 1 a 20 farai 1+rand()%20.
Tieni conto che se ti servono i numeri casuali per motivi seri,
e se il tuo compilatore e' vecchio, i bit "bassi" prodotti
da rand() potrebbero non essere molto casuali (e' un difetto noto
di alcuni metodi di generazione).
In tal caso, un  sistema piu' costoso ma piu' sicuro
per generare numeri R tra 0 e N-1
(aggiungi 1 per avere numeri tra 1 e N):
R = (int) (rand()/(RAND_MAX+1.0));
(dove, grazie alla somma di 1.0, le operazioni
si fanno sui double, per poi ritornare agli int per
troncamento.
Alternativamente puoi scartare i bit bassi facendo uno
shift: R = (rand()>>8)%N;
Infine tieni conto che su diversi compilatori possono
esistere in libreria diverse funzioni, tipo rand(), random(),
lrand48() con diverse caratteristiche, in termini
di bonta' dei numeri generati e range di generazione.
Comunqe tranquillizzati: per semplici applicazioni
anche il banale rand()%N puo' andare bene.
ciao,
g.

,
| > dromeda...@inwind.itDELETE says...
| >
| >>"Giovanni Resta" <g.r...@iit.cnr.it.nospam> ha scritto nel messaggio
| >>news:3E53E56C...@iit.cnr.it.nospam...
| >>
| >>CUT CUT CUT
| >>
| >>| Se vuoi ottenere numeri rand tra 0 e 19 la strada e' un'altra...
| >>| ciao,
| >>|
| >>
| >>immaginavo di aver scelto la strda sbagliata.... :-(((
| >>
| >>ehi, mica potresti darmi un'indicazione? :-)
| >>
| >
| >
| > prova a usare (rand()%20) invece che rand()
|
| Perfetto. Naturalmente se vuoi numeri da 1 a 20 farai 1+rand()%20.
| Tieni conto che se ti servono i numeri casuali per motivi seri,
| e se il tuo compilatore e' vecchio, i bit "bassi" prodotti
| da rand() potrebbero non essere molto casuali (e' un difetto noto
| di alcuni metodi di generazione).
grazie mille per  la spiegazione e i consigli di entrambi.
per curiositą puoi spiegarmi meglio questa storia dei bit "bassi"?
grazie ancora
ivan

 per curiositą puoi spiegarmi meglio questa storia dei bit "bassi"?
Diciamo che si sono accorti che certi generatori di numeri casuali
implementati nelle librerie standard del C
possono dare un output non troppo casuale se uno li considera
modulo un numero piccolo (o, per spiegare i "bit bassi", modulo
una piccola potenza di due: se tu fai r%8 siccome 8=2^3 e' come
prendere i 3 bit meno significativi di r, cosa che tra l'altro
puoi fare con r & 7. )
Per esempio, facendoli modulo 4 magari, invece di avere 0,1,2, o 3
al 25% veniva fuori che non erano equiprobabili, oppure, cosa
piu' subdola ma deleteria in certi contesti,
che i moduli si susseguivano secondo un pattern facilmente prevedibile, 
tipo  2013 3012 2013 3012 2013 ....
ciao,
g.

 > per curiosità puoi spiegarmi meglio questa storia dei bit "bassi"?

Aggiungo che, se interessano i numeri casuali, può probabilmente
valere la pena di dare un occhio alla Random Number Library
di Boost:
http://www.boost.org/libs/random/index.html
che è in C++ standard e fornisce vari generatori e vari tipi di
distribuzioni.
In più ha licenza Boost-compatibile per cui ci fai praticamente quel
che vuoi.
--
Gerolamo
E' in corso la votazione di it.comp.software.webserver
Se sei interessato alla creazione di questo NG, leggi il messaggio:
news:MK.it.comp.softw...@news.nic.it