Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Koliko su stvarno slucajni brojevi slucajni

[es] :: C/C++ programiranje :: Koliko su stvarno slucajni brojevi slucajni

[ Pregleda: 5527 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

_owl_

Član broj: 318
Poruke: 1042
*.rcub.bg.ac.yu



+3 Profil

icon Koliko su stvarno slucajni brojevi slucajni22.07.2001. u 23:17 - pre 233 meseci
Napisao sam mali program u c-u koji koristi funkciju rand().
Ono sto je zanimljivo je da mi program stalno daje iste brojeve.
napravio sam mali test i stalno dobijam iste rezultate.
Bez obzira kao koji user startujem program (a do sada sam ga startovao jedno 10 puta u toku 2-3 sata stalno sam dobijao iste brojeve , iako sam jedanput resetovo masinu).
Da li postoji nacin da "stvarno" dobijem slucajne brojeve?



Owl
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.verat.net



Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni23.07.2001. u 01:02 - pre 233 meseci
Ako oces bas slucajne brojeve koristi vreme...to se uvek menja
 
Odgovor na temu

_owl_

Član broj: 318
Poruke: 1042
*.rcub.bg.ac.yu



+3 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni23.07.2001. u 13:43 - pre 233 meseci
Da tek sad sam video da postoji srand(), ipak hvala na odgovoru.



Da li to znaci da ako se zna seed koji se da rand funkciji pre njenog

pozivanja mozemo predvideti sve brojeve koje ce ona dati (samo

napisemo program koji ce da koristi taj seed -- na istoj masini)






Owl
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.verat.net



Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni23.07.2001. u 13:59 - pre 233 meseci
Nisam gledao random i srand funkciju ali ako bas oces slucajne brojeve na UNIXu,moja preporuka je :

Code:

#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main(){
 int fd,rand;
 fd = open("/dev/urandom",O_RDONLY);
 read(fd,&rand,sizeof(int));
 printf("%dn",rand);
}

 
Odgovor na temu

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.verat.net



+2 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni23.07.2001. u 14:06 - pre 233 meseci
U Turbo C-u je postojala funkcija randomize(), tako:

randomize();
printf("%d\n",rand()%100 );

dobices talno razlicit rezultat.

poz.
 
Odgovor na temu

_owl_

Član broj: 318
Poruke: 1042
*.rcub.bg.ac.yu



+3 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni24.07.2001. u 00:15 - pre 233 meseci
ma ima i c funkciju rand() ali kao sto napisah ako vise puta startujes program koji je koristi dobices iste brojeve, npr:

for (i=0; i<1000; ++i)
{
nmb=rand();
printf("%dn", nmb);
}

daje stalno iste brojeve.
Predatore hvala za savet mislio sam da rand() koristi /dev/random.
Owl
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
165.121.42.*



+18 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni24.07.2001. u 00:45 - pre 233 meseci
Citat:
_owl_ je napisao:
ma ima i c funkciju rand() ali kao sto napisah ako vise puta startujes program koji je koristi dobices iste brojeve, npr:

for (i=0; i<1000; ++i)
{
nmb=rand();
printf("%dn", nmb);
}

daje stalno iste brojeve.
Predatore hvala za savet mislio sam da rand() koristi /dev/random.


Evo kako se to radi - batali /dev/random - sporije je i nije portabilno:

Code:

srand( (unsigned)time( NULL ) );
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.rcub.bg.ac.yu

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni26.07.2001. u 02:28 - pre 233 meseci
Ovde je problem zato što se koriste pseudo-slučajni brojevi.

Prema tome, ni rešenje sa upotrebom izlaza time() funkcije za seed nije dovoljno dobro, pošto se može lako predvideti. Zato je rešenje sa /dev/random najbolje, zato što ono omogućava upotrebu čak i spoljašnjih generatora slučajnih brojeva. Naravno, neki računari ih imaju ugrađene, pa ih treba i iskoristiti, ali "slučajni" brojevi dobijeni pomoću rand() funkcije ne treba koristiti ni za kakav ozbiljan posao.

Toliko.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.verat.net

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni15.09.2001. u 19:02 - pre 231 meseci
Citat:
tOwk je napisao:
Ovde je problem zato što se koriste pseudo-slučajni brojevi.

Prema tome, ni rešenje sa upotrebom izlaza time() funkcije za seed nije dovoljno dobro, pošto se može lako predvideti. Zato je rešenje sa /dev/random najbolje, zato što ono omogućava upotrebu čak i spoljašnjih generatora slučajnih brojeva. Naravno, neki računari ih imaju ugrađene, pa ih treba i iskoristiti, ali "slučajni" brojevi dobijeni pomoću rand() funkcije ne treba koristiti ni za kakav ozbiljan posao.

Toliko.


Pa sve zavisi kolika je periodicnost same random funkcije, nasao sam negde algoritam, ako se dobro secam na weirdowom sajtu, koji ima periodu 2^144, mislim da je to sasvim dovoljno i za neki ozbiljniji projekat.
Po meni random f-je i treba da daju iste rezultate sa istem seedom, radi prenosivosti same stvari. Jer u neku runu totalni random ste ipak u neku ruku stavili pod kontrolu. Evo sada i koda doduse malo sam ga doradio za svoje potrebe nekada davno :)



#ifndef __TSlucajni
#define __TSlucajni
#include <math.h>
#include <time.h>

class TSlucajni{
private:
float u[97], c, cd, cm;
int i97, j97;

public:
TSlucajni(int,int); //randomize
float Rnd(void); // interval [0,1)
inline int Ceo(int n ) // interval [0,n] celih
{return (n+1)*Rnd();}
int Interval(int,int); // interval celih [a,b]
float Interval(float,float); // interval realnih [a,b)
};
/*
randomize1
----------
* Ovo je inicijalizaciona rutina za generator slucajnih brojeva: rnd1
* Seed varijable moraju uzimati sledece opsege vrednosti:
0 <= IJ <= 31328
0 <= KL <= 30081
t Za proveru random generatora: uzeti IJ = 1802 & KL = 9373. Zatim treba
generisati 20 000 slucajnih brojeva. Sledecih sest brojeva pomnoženih sa
4096*4096 bi trebalo da budu:
6533892.0 14220222.0 7275067.0 6172232.0 8354498.0 10633180.0 */


TSlucajni::TSlucajni (int ij=time(0)%31328, int kl=time(0)%30081)
{
float s, t;
int i, j, k, l, m;
int ii, jj;

i = fmod(ij/177.0, 177.0) + 2;
j = fmod(ij , 177.0) + 2;
k = fmod(kl/169.0, 178.0) + 1;
l = fmod(kl , 169.0);

for (ii=0; ii<=96; ii++ )
{
s = 0.0;
t = 0.5;
for (jj=0; jj<=23; jj++ )
{
m = fmod( fmod(i*j,179.0)*k , 179.0 );
i = j;
j = k;
k = m;
l = fmod( 53.0*l+1.0 , 169.0 );
if ( fmod(l*m,64.0) >= 32)
s = s + t;
t = 0.5 * t;
}
u[ii] = s;
}

c = 362436.0 / 16777216.0;
cd = 7654321.0 / 16777216.0;
cm = 16777213.0 / 16777216.0;

i97 = 96;
j97 = 32;

return;
}

/*
rnd1
----
* Generator slucajnih brojeva u opsegu: [0-1)
* Ovo je NAJBOLJI dostupni generator slucajnih brojeva. Prolazi SVE testove
za generatore slucajnih brojeva i ima periodu od 2^144 (!). Da bi dao
ispravne rezultate mantise u float point prikazu brojeva moraju biti
najmanje 24 bitne. Pokazuje izuzetnu stabilnost pri ogromnim serijama.
To sam proverio testom Romanovskog za najmanje 10^8 generisanih brojeva.
* Zapazi da su JEDINE matematicke operacije sabiranje i oduzimanje
(iako ima i float-pointing matematike)->BRZINA! */

float TSlucajni::Rnd(void)
{
float uni;

uni=u[i97]-u[j97];
if (uni < 0.0) uni+=1.0;
u[i97]=uni;
i97--;
if (i97 < 0) i97=96;
j97--;
if (j97 < 0) j97=96;
c-=cd;
if (c < 0.0) c+=cm;
uni-=c;
if (uni < 0.0) uni+=1.0;
return (uni);
}

int TSlucajni::Interval(int a,int b){
if( a == b ) return a;
else if(a>b) {int c=a;
a=b;b=c;
}
return a+Ceo(b-a);
}

float TSlucajni::Interval(float a, float b){
if( a == b ) return a;
else if(a>b) {float c=a;
a=b;b=c;
}
return a+(b-a)*Rnd();
}


#endif


 
Odgovor na temu

random
Vladimir Vrzić
Beograd

Član broj: 85
Poruke: 3866
*.verat.net

Sajt: www.last.fm/user/vrza


+4 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni16.09.2001. u 14:26 - pre 231 meseci
A jel si probao sa random() i srandom() umesto rand() i srand(), vrlo su malo sporije, a bolje se ponaaju...

iseak iz random(3):

DESCRIPTION
The random() function uses a non-linear additive feedback random number
generator employing a default table of size 31 long integers to return
successive pseudo-random numbers in the range from 0 to (2**31)-1. The
period of this random number generator is very large, approximately
16*((2**31)-1).

The random() and srandom() functions have (almost) the same calling
sequence and initialization properties as the rand(3) and srand(3) func-
tions. The difference is that rand(3) produces a much less random
sequence -- in fact, the low dozen bits generated by rand go through a
cyclic pattern. All the bits generated by random() are usable. For
example, `random()&01' will produce a random binary value.

Pored toga, /dev/random treba koristiti samo u sluaju da aplikacija ne koristi velike koliine sluajno generisanih brojeva, u suprotnom treba koristiti /dev/urandom() (videti random(4))...
int rand(void);

Those who do not understand Unix are condemned to reinvent it, poorly.

Upali lampicu — koristi Jabber!
 
Odgovor na temu

BigFoot
Boban Jovanović
Arilje

Član broj: 1098
Poruke: 991
*.ptt.yu



+35 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni16.10.2001. u 20:57 - pre 230 meseci
Citat:
_owl_ je napisao:
Napisao sam mali program u c-u koji koristi funkciju rand().
Ono sto je zanimljivo je da mi program stalno daje iste brojeve.
Da li postoji nacin da "stvarno" dobijem slucajne brojeve?

Ne. "Stvarno" slucajne brojeve ne mozes dobiti. Uvek su to pseudo-slucajni brojevi, ali su toliko "slucajni" da je to uglavnom dovoljno. Jedino mozes nesto uraditi po pitanju toga da eventualno imaju normalnu raspodelu, ako ti to znaci.
Two beer or not two beer...
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.verat.net

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni20.10.2001. u 11:46 - pre 230 meseci
Citat:
BigFoot je napisao:
Citat:
_owl_ je napisao:
Napisao sam mali program u c-u koji koristi funkciju rand().
Ono sto je zanimljivo je da mi program stalno daje iste brojeve.
Da li postoji nacin da "stvarno" dobijem slucajne brojeve?

Ne. "Stvarno" slucajne brojeve ne mozes dobiti. Uvek su to pseudo-slucajni brojevi, ali su toliko "slucajni" da je to uglavnom dovoljno. Jedino mozes nesto uraditi po pitanju toga da eventualno imaju normalnu raspodelu, ako ti to znaci.

Ili eventuolno da se napravi neki hardverski uredjaj pa bi imao totalni random, pade mi na pamet mogao bi da pokupis sum sa muzicke karte i njega da koristis kao random
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16051
*.verat.net



+6810 Profil

icon Re: Koliko su stvarno slucajni brojevi slucajni20.10.2001. u 11:54 - pre 230 meseci
Neki procesori vec imaju slicnu stvar - meri se temperatura procesora i na osnovu varijacije se mogu generisati prilicno random brojevi - a i sum je dobra ideja :)
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1
Demo Videos: http://www.digicortex.net/node/17
Gallery: http://www.digicortex.net/node/25
 
Odgovor na temu

[es] :: C/C++ programiranje :: Koliko su stvarno slucajni brojevi slucajni

[ Pregleda: 5527 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.