Newsgroup: it.comp.programmare.win32
Titolo: liste casuali

ciao a tutti,
forse non e' un argomento strettamente riguardante win32 ma vi prego di
leggere cmq il post...
grazie!
devo creare una lista di 256 valori casuali (per la precisione dei char), ma
devono essere tutti diversi tra loro
per ottenere cio' ho creato una lista contenente tutti i possibili valori
(da 0 a 255),
poi utilizzando la rand() scelgo una posizione nella suddetta lista, lo
copio nel vettore che deve contenere i valori in ordine casuale,
e elimino dalla lista di "prelievo" quel valore e scalo di un posto quelli
dopo...
e' un po' macchinoso ma non sono riuscito a pensare di meglio...
mi si presentano due problemi:
1- i valori restituiti da rand() sono sempre uguali ad ogni esecuzione della
funzione, mi sembra di aver sentito che la rand() fa cosi', ma come posso
ottenere dei valori che siano piu' vicini possibile al casuale?
2- problema davvero strano: non so di chi sia la colpa e non voglio accusare
ne' il compilatore ne' windows, quasi certamente sbaglio io, ma... fatto sta
che durante le suddette operazioni di copiatura, ogni tanto il valore viene
copiato e altre volte no, in maniera del tutto irregolare e sempre diversa
(per cui escluderei di incolpare la rand() ), alla fine quindi mi trovo un
vettore di 256 elementi in gran parte sistemati correttamente e diversi tra
loro ma intervallati da buchi di 0xcc, praticamente li' non vengono copiati
valori, eppure il ciclo e' ripetuto sempre uguale per 256 volte...
grazie a chiunque mi possa dare una mano
ps. magari se potete anche suggerirmi un algoritmo meno macchinoso per fare
suddetta operazione...
grazie ancora ^_^

 valori, eppure il ciclo e' ripetuto sempre uguale per 256 volte...
Forse questo capita perché alcuni 'char' corrispondono a caratteri
speciali...
ti consigio di copiare i valori come "int".... non so di preciso come tu
abbia fatto
e quindi magari questo non ti aiuta per niente...
Ciao e buon anno
ByZ-2K

grazie di tutto!
provero' a vedere cosa succede...

 devono essere tutti diversi tra loro
 char y=SEME;
 for(int i=0;i<256;i++) y=(y*5+1)&0xFF;
ottieni -128 <= y <= 127 con le y tutte diverse.
Ovviamente se utilizzi unsigned char ottieni valori da 0 a 255.
SEME può essere un valore qualunque; puoi usare per esempio GetTickCount() o
time().
Devo precisare che la sequenza generata in questo modo è sempre la stessa,
cioè avrai sempre 1, 6, 31, -100, 13...
Variando SEME fai solo in modo di posizionarti in un punto qualunque della
sequenza: una volta inizierai con 1, 6, 31... un'altra volta con 31, -100,
13... un'altra ancora con 6, 31, -100...
Ciao
Cristiano

 suddetta operazione...
Potresti farlo con delle permutazioni:
#define NUM_LOOPS 1000
unsigned char array[256], tmp;
int a, idx1, idx2;
for( a=0; a<256; a++)
    array[a] = (unsigned char)a;
for( a=0; a<NUM_LOOPS; a++)
{
    idx1 = rand() % 256;
    do { idx2 = rand() % 256; } while( idx1==idx2);
    tmp = array[idx2];
    array[idx2] = array[idx1];
    array[idx1] = tmp;
}
--
Lorenzo

 Lorenzo
grazie x la tua spiegazione :-)
se ti interessa (e se non lo sai gia'!) colgo l'occasione per mostrarti
queste tre righe
array[idx1] ^= array[idx2];
array[idx2] ^= array[idx1];
array[idx1] ^= array[idx2];
cosi' non devi occupare memoria per tmp ^_^
ciao e grazie ancora...

 array[idx1] ^= array[idx2];
Una volta lo sapevo, ma mi ero dimenticato. Grazie per il rinfresco. :-)
--
Lorenzo

 cosi' non devi occupare memoria per tmp ^_^
Ok, ma visto che la memoria in questi casi spesso non è un problema rendi 
solo il codice meno leggibile per chi può non conoscere/ricordare questo 
'giro'...
-- 
Luc.

 cosi' non devi occupare memoria per tmp ^_^
questa e' roba che si faceva venti anni fa, quando si lavorava con qualche
K in assembler. Ricordo ancora un gestore di tastierino con uno Z80 fatto
senza usare RAM, utilizzando solo i registri. Ormai sono trucchi da poveri,
validi solo a scopo didattico, usarli adesso sarebbe come rivoltare la
stoffa dei colletti o far risuolare le scarpe del supermercato.
Risparmiare una variabile char e ledere la leggibilita' e'gia da galera, in
un sorgente di programmare.win32 e' da ergastolo... :)
buon anno
Ermando