[ Meklaud @ 26.02.2007. 20:21 ] @
Pozdrav svima.

Hteo sam da napravim niz koji se puni double vrednostima -20 do 20 i da recimo pomocu Math.random() metode dobijem neki broj koji cu ja pomnoziti brojem izmedju -20 i 20 i tako dobiti neke vrednosti.Hteo sam to da uradim kroz neku for petljicu, ali ne znam bas kako bih pomnozio neki random broj i sa nekim pozitivnim i negativnim brojevima.

for(int i=0;i<niz.length;i++)
{
niz = Math.random()* ????????
}

recimo da hocu 50 vrednosti da dobijem izmedju -20 i 20


Hvala
[ mizob @ 26.02.2007. 20:45 ] @
Mozes ovako, mada je relativno lose napisano, ali radi posao


Code:

for(int i=0; i<niz.length; )
{
niz[i] = Math.random();
if ( ( niz[i] < 20 ) && ( niz[i] > -20 ) ) i++;
}




[Ovu poruku je menjao Milos Zobenica dana 26.02.2007. u 21:57 GMT+1]
[ anon315 @ 26.02.2007. 20:59 ] @
Code:

Random generator = new Random();
for(int i=0;i<niz.length;i++) {
    niz[i] = generator.nextInt(20 - (-20) + 1) + (-20);
}
[ anon315 @ 26.02.2007. 21:02 ] @
Za slucaj da nije ocigledno - dakle generator.nextInt(41) ti daje brojeve u opsegu [0, 40]. Ako od tog opsega oduzmes 20 dobijes opseg [-20, 20], a to je ono sto ti treba
[ Meklaud @ 27.02.2007. 07:57 ] @
Hvala na pomoci,

sinoc sam malo razmislio pa sam uradio kao niz=Math.random()*40-20

Hvala jos jednom
[ dany @ 28.02.2007. 12:33 ] @
Za to postoji jedan opti princip, a to je pravljenje bijekcije iz opsega skupa koji daje funkcija Math.random() sa opsegom koji nama treba. Po teoriji, moguce je napraviti bijekciju preslikavanja opsega realnih brojeva iz opsega [0,1) sa beskonacnim skupom realnih brojeva. To je onaj dokaz iz Matematicke algebre, ne secam se tacno kako ide, ali cak nije ni tesko, ako neko hoce, mogu da se 'napnem' pa da ga se prisetim. No to nije vazno, vazno je da racunari ne rade sa beskonacnim brojevima, pa mi preslikavamo u opseg koji nama treba.

Takodje, vazno je primetiti da opseg koji generise funkcija random() obuhvata nulu, ali ne i jedinicu.

Da ne davim teorijom (koje se, usput ni ja tacno ne secam), vazno je reci da se tu koriste samo dve operacije nad opsegom:
- skaliranje
- pomeranje (vise volim izraz siftovanje).

Ako hocemo opseg izmedju 0 i nekog broja n, vrsimo mnozenje Math.random() sa tim brojem n (skaliranje).
A, ako hocemo da taj opseg ne pocinje od nule, vec od nekog broja, dodamo taj broj na prethodni rezultat (siftovanje).

Znaci, u tvom slucaju, ako bi hteli opseg izmedju -20 i 20, prvo oduzmemo granice opsega 20 - (-20) i dobijemo opseg od 0 do 40. Zatim vrsimo dodavanje broja (-20) na rezultat i dobijamo opseg izmedju -20 i 20. Tacno onako kako si ti uradio.

Zakljucak:
Uvek se vrsi prvo skaliranje sa brojem koji dobijamo oduzimanjem granice opsega.
Zatim se vrsi siftovanje brojem koji je donja granica opsega.

Napomena:
Krajnji rezultat je broj tipa double iz opsega [-20,20), znaci broj 20 nije ukljucen u rezultat.

@Vanja Petreski:
Tvoj primer je dobar ako nam trebaju celi brojevi, ali Meklaud je trazio:
Citat:
niz koji se puni double vrednostima

Pozdrav
[ anon315 @ 28.02.2007. 13:21 ] @
Da, skapirao sam u medjuvremenu :)