[lnkForumImage]
Download FREE Software.

Confronta i prezzi di migliaia di prodotti.
News Forum Italiano
 Home | Login | Registrati | Ricerca 


 

Forums >

it.comp.giochi.sviluppo

numeri casuali

MandarX

07/03/2010 13:28:34

Ciao

ho l'impressione che su McOsX i numberi casuali non siano tanto casuali,
almeno non concome su Windows.

in c++ uso srand(time(0)) e rand() %

ma sto pensando a creare un array di numeri pseudo casuali!

voi cosa fate per avere numeri casuali???

MandarX

http://manda...

36 Risposte

Gianpaolo Ingegneri

07/03/2010 22:19:34

0


"MandarX" <mandarx@gmail.com> ha scritto nel messaggio
news:4b93aa0c$0$6838$5fc30a8@news.tiscali.it...
> Ciao
>
> ho l'impressione che su McOsX i numberi casuali non siano tanto casuali,
> almeno non concome su Windows.
>
> in c++ uso srand(time(0)) e rand() %
>
> ma sto pensando a creare un array di numeri pseudo casuali!
>
> voi cosa fate per avere numeri casuali???

Uso una funzione per gli pseudocasuali, non c'è bisogno di creare un array.
double UF_Math_PseudoRandom(long x)
{
x = (x<<13)^x;
return (double)((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) /
2147483648.0;
}

Restituisce un valore da 0 a 1 per ogni ciascun valore di x.


MandarX

08/03/2010 14:05:18

0


> Uso una funzione per gli pseudocasuali, non c'è bisogno di creare un array.
> double UF_Math_PseudoRandom(long x)
> {
> x = (x<<13)^x;
> return (double)((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) /
> 2147483648.0;
> }
>
> Restituisce un valore da 0 a 1 per ogni ciascun valore di x.

si ma che costo ha ??

MandarX

08/03/2010 18:26:40

0

MandarX ha scritto:

> si ma che costo ha ??

un array non ha costo anche se spreca un po di memoria

Gianpaolo Ingegneri

08/03/2010 18:33:35

0


"MandarX" <mandarx@gmail.com> ha scritto nel messaggio
news:4b950428$0$6819$5fc30a8@news.tiscali.it...
>
>> Uso una funzione per gli pseudocasuali, non c'è bisogno di creare un
>> array.
>> double UF_Math_PseudoRandom(long x)
>> {
>> x = (x<<13)^x;
>> return (double)((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff)
>> / 2147483648.0;
>> }
>>
>> Restituisce un valore da 0 a 1 per ogni ciascun valore di x.
>
> si ma che costo ha ??

Come vedi c'è uno shift, un'elevazione a potenza, tre moltiplicazioni, due
somme, un and ed una divisione, non è velocissimo se lo devi fare per ogni
pixel di un'immagine, ad esempio. In quel caso ti converrebbe usare una
lookup table, comunque non credo che la rand() sarebbe più veloce.


Gianpaolo Ingegneri

08/03/2010 18:35:51

0


"MandarX" <mandarx@gmail.com> ha scritto nel messaggio
news:4b95416c$0$700$5fc30a8@news.tiscali.it...
> MandarX ha scritto:
>
>> si ma che costo ha ??
>
> un array non ha costo anche se spreca un po di memoria

Ovvio, però dipende sempre da quello che devi fare. Inoltre mi era sembrato
di capire che la rand() non ti da gli stessi risultati su configurazione
diverse, quindi per precalcolarti la lookup table devi fare sempre uso di
una funzione alternativa.


MandarX

08/03/2010 19:25:06

0

Gianpaolo Ingegneri ha scritto:

> Inoltre mi era sembrato
> di capire che la rand() non ti da gli stessi risultati su configurazione
> diverse, quindi per precalcolarti la lookup table devi fare sempre uso di
> una funzione alternativa.

si comunque la tua la proverò grazie!!

(Matteo Perenzoni)

08/03/2010 21:03:38

0

On 8 Mar, 19:33, "Gianpaolo Ingegneri"
<gingegneri82_NOSP...@hotmail.it> wrote:
> "MandarX" <mand...@gmail.com> ha scritto nel messaggionews:4b950428$0$6819$5fc30a8@news.tiscali.it...
>
>
>
> >> Uso una funzione per gli pseudocasuali, non c'è bisogno di creare un
> >> array.
> >> double UF_Math_PseudoRandom(long x)
> >> {
> >> x = (x<<13)^x;
> >> return (double)((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff)
> >> / 2147483648.0;
> >> }
>
> >> Restituisce un valore da 0 a 1 per ogni ciascun valore di x.
>
> > si ma che costo ha ??
>
> Come vedi c'è uno shift, un'elevazione a potenza, tre moltiplicazioni, due
> somme, un and ed una divisione, non è velocissimo se lo devi fare per ogni
> pixel di un'immagine, ad esempio. In quel caso ti converrebbe usare una
> lookup table, comunque non credo che la rand() sarebbe più veloce.

La rand() rientra (solitamente...) in questo genere:
http://en.wikipedia.org/wiki/Linear_congruential...
con una moltiplicazione, una somma, un modulo, quindi credo
decisamente più veloce.
Qui c'è una lista di altri metodi, se può essere utile:
http://en.wikipedia.org/wiki/List_of_pseudorandom_number_...

Ricordo che temo fa avevo trovato un articolo che suonava come "ecco
perchè la rand() fa schifo, ed ecco cosa usare come generatore di
numeri casuali", ma non lo trovo più.
________________________
Matteo
http://fuzzware.alte...
"A man with a new idea is a crank until the idea succeds" - M. Twain

MandarX

09/03/2010 17:11:32

0

grazie per i link

> Ricordo che temo fa avevo trovato un articolo che suonava come "ecco
> perchè la rand() fa schifo

in effetti lo avevo sentito anch'io

comunque la verita è che i computer hanno grandi problemi a generare
numeri che sembrino veramente casuali

io sto facendo cosi

mi sono generato un array di 150 posti e l'ho riempito di quei numeri
casuali che servono per il mio gioco (sono indici di item)
(sotto windows ci sono risultati soddisfacenti m sotto mac erano sempre
gli stessi)

durante il gioco carico l'array (circolare) e uso un numero casuale come
indice di partenza che incremento ogni volta che si crea un item

ma ora sto pensando di analizzare quali numeri casuali sono "usciti" in
modo da fare qualche correzione in relazione anche livello di difficolta.

Gianpaolo Ingegneri

09/03/2010 20:48:01

0


> io sto facendo cosi
>
> mi sono generato un array di 150 posti e l'ho riempito di quei numeri
> casuali che servono per il mio gioco (sono indici di item)
> (sotto windows ci sono risultati soddisfacenti m sotto mac erano sempre
> gli stessi)
>
> durante il gioco carico l'array (circolare) e uso un numero casuale come
> indice di partenza che incremento ogni volta che si crea un item
>
> ma ora sto pensando di analizzare quali numeri casuali sono "usciti" in
> modo da fare qualche correzione in relazione anche livello di difficolta.

Non conosco il tuo gioco, ma 150 non sono un po' pochi? Alla fine si
ripeterà tutto in un periodo di 150 campioni, oppure no? Comunque mi sembra
strano che su mac la funzione di random non funzioni.


MandarX

10/03/2010 16:38:59

0

Gianpaolo Ingegneri ha scritto:

> Non conosco il tuo gioco, ma 150 non sono un po' pochi? Alla fine si
> ripeterà tutto in un periodo di 150 campioni, oppure no?

si ma i numeri chemi servono vanno da 0 a 7 per cui 150 danno
l'illusione di varieta e considera che l'indice di partenza è sempre diverso

> Comunque mi sembra
> strano che su mac la funzione di random non funzioni.

anche a me ma in alcuni casi ottengo sempre lo stesso numero!!

il codice è lo stesso per tutti i sistemi operativi