|
[ maxmagnus2 @ 02.11.2004. 15:24 ] @
| Cao,
kako da napravim funkciju koja rnd izdaje
rnd (slucajan) broj?
srand((unsigned) time(NULL));
rez=(int) rand();
Ovo mi non stop izbacuje isti niz rnd brojeva!?
Moze i on da se nekako iskoristi ali mora da postoji laksi nacin?
MM |
[ JogyII @ 02.11.2004. 15:28 ] @
generator inicijalizujes samo jednom na pocetku programa, ili ce ti niz uvek biti isti,
pogledaj parmetre za srand
[ Dragi Tata @ 02.11.2004. 15:38 ] @
srand je generaator pseudo-slučajnih brojeva. Ako ti trebaju istinski slučajni brojevi, pogledaj:
http://www.boost.org/libs/random/
[ blaza @ 02.11.2004. 16:19 ] @
Verovatno si hteo da kazes da je rand() generator pseudo-slucajnih brojeva.
srand() je funkcija koja inicijalizuje generator pseudo-slucajnih brojeva, odnosno inicijalizuje interne parametre generatora, commonly referred to as seed.
[ Dragi Tata @ 02.11.2004. 16:24 ] @
Iskreno, odavno nisam koristio CRT funkcije za slučajne brojeve, pa sam i zaboravio kako to ide :)
[ Dejan Lozanovic @ 02.11.2004. 20:44 ] @
odlican link, ja sam imam negde po disku source za algoritam koji daje periodu od 2^144-1 i to sam vikao da je ultra mocno a sada vidim da ima i vecih zverkica.
Nego DT imas li jos ovako dobrih linkova u rukavu ?
[ srki @ 02.11.2004. 23:17 ] @
Pa u principu znam kako DT nalazi te linkove. Kada ti treba neka biblioteka prvo pogledas da li ima medju http://www.boost.org/ blibliotekama. Ako je u pitanju rasprava o dizajnu koda onda DT kupi linkove sa:
http://www.gotw.ca/gotw/
http://www.cuj.com/articles/
http://www.artima.com/index.jsp
http://www.ddj.com/topics/cpp/
http://www.research.att.com/~bs/C++.html
Kada neki pita kako da uradi nesto (koristi threads, IPC, tutorials, ovo ono...) onda mu da linkove sa www.codeproject.com
Pored toga se nadje mozda poneki link koji govori o jednoj stvari ali ovi gore sajtovi su mu osnovni za trazenje svega i svacega.
DT, da li sam dobro procenio tvoj tok razmisljanja?
[ Milos Stojanovic @ 03.11.2004. 00:16 ] @
Citat: Dragi Tata: srand je generaator pseudo-slučajnih brojeva. Ako ti trebaju istinski slučajni brojevi, pogledaj
hm, da li zaista postoje generatori pravih slučajnih brojeva?
[ BytEfLUSh @ 03.11.2004. 00:24 ] @
Verovatno najslučajniji brojevi koje možeš naći:
http://www.fourmilab.ch/hotbits/
[ -zombie- @ 03.11.2004. 00:47 ] @
what trooper said..
(naravno, bez nekog externog hardvera.. a ni jedna biblioteka (pa ni boost) ne može to da zameni..)
[ blaza @ 03.11.2004. 00:59 ] @
Citat: trooper: hm, da li zaista postoje generatori pravih slučajnih brojeva?
Naravno. Npr. http://www.randomnumbergenerator.nl/rng/home.html
Uredjaji ovakvog bazirani su na elektronskom izvoru suma koji radi na principu odredjenog slucajnog fizickog procesa (npr. lavinski proboj PN spoja).
Za razliku od softverskih generatora slucajnih brojeva, ovi generatori se ne mogu "inicijalizacijom internih parametara" dovesti u stanje nakon kojeg su rezultati ponovljivi.
[ filjo @ 03.11.2004. 03:05 ] @
Kada nadjes jedan proces u prirodi koji se stvarno slucajno desava onda - postoji.
Ja bi naprimer generisao slucajne brojeve na osnovu variranja napona u el.mrezi.
[ filmil @ 03.11.2004. 08:23 ] @
Citat: srand je generaator pseudo-slučajnih brojeva. Ako ti trebaju istinski slučajni brojevi, pogledaj:
Svi programski generatori daju pseudoslučajne brojeve. Čak ni boost biblioteka ne može ništa protiv toga, osim ako ne koristi neki stvarno slučajan (dakle eksterni) proces, sa spektralnom gustinom srednje snage (dovoljno) približnom belom šumu.
[ rivan @ 03.11.2004. 08:26 ] @
Imas pristojne slucajne brojeve na raznim *nix-ima /dev/random i /dev/urandom (ovaj drugi je malo manje slucajan). Imas manual za ovo "man 4 random"...
[ maxmagnus2 @ 03.11.2004. 13:03 ] @
Hmm, ako sam dosao do dobrog zakljucka:
ili treba da preuzmem neki fajl pun rnd brojeva ili da se vezem na napon
pa da zaigram?
MM
[ Dragi Tata @ 03.11.2004. 13:26 ] @
Ok, OK, I stand corrected.
Skoro da si u pravu. Boost nemam šta da "gledam" - znam šta tamo ima jer ga koristim svakodnevno. Boost biblioteke su "predvorje standarda" i okosnica modernog C++ programiranja. I Code Project pratim redovno, pa je samo problem da se setim gde se tačno nalazi traženo rešenje.
Što se tiče ostalih sajtova (osim ddj-a koji ne posećujem) njih "čituckam" u slobodno vreme, pa ih povremeno koristim kao izvor.
[ filmil @ 03.11.2004. 15:31 ] @
Citat: Hmm, ako sam dosao do dobrog zakljucka:
ili treba da preuzmem neki fajl pun rnd brojeva ili da se vezem na napon
pa da zaigram?
A da probaš da nam pošalješ ceo program koji daje uvek istu sekvencu brojeva, pa da vidimo o čemu se tačno radi? Mirišem da nisi dobro objasnio šta ti treba, jer pravi slučajni brojevi ti u većini računarskih primena nisu neophodni.
f
[ maxmagnus2 @ 08.11.2004. 14:02 ] @
Problem je bio u sledecem:
gore navedeni kod (2 reda) je smesten u f-ju koja je samo
vracala rnd.
Problem je bio u tome sto bi ta f-ja vratila u prvih 5-6 poziva isti br(!?) a u
narednih opet 5-6 drugi?! itd...
Ovo sam resio tako sto bih pozvao u f-ji br svaki sledeci put po jednom vise
i (ala sam ga sad iskomplikovao :) tada bi mi dao 2,3,4. po redu rnd br
koji mi u stvari i odgovara.
*****************************************************
int f_random(int min_random, int max_random_br,int koji_po_redu_rnd) //vraca jednocifren int koji je random
{ int rez=max_random_br+1;
srand((unsigned) time(NULL));
for(int i=0;i<=koji_po_redu_rnd;i++)
{ rez=0;
while(rez<min_random)
{ rez=(int) rand();
rez=(int) (rez- ( (int)(rez/max_random_br)*max_random_br ));
};
};
cout<<"*********************"<<rez<<"********"<<endl;
return rez;
};
**********************************************************
I to bi bilo otprilike to ...
MM
[ Riste Pejov @ 14.11.2004. 13:57 ] @
Ako koristis kojeg bilo vida UNIX-a, onda najbolje resenje ti je:
fopen("/dev/random","rb");
/dev/random ti je najbolji moguci softverski random generator, posto svoje entropije skuplja iz internih parametra kernela i stanje drajvera u sistemu. Poenta random generatora je ustvari da se ne moze predvideti sledeci broj, a ukoliko se koristi neka funkcija za generiranje random broja koja ne uzima parametre iz kernela, onda se ista moze predvideti. Jedini problem sa /dev/random ti je da iz tog fajla ne moze procitati nista dok se kernelova entropija ne zadovolji. Ukoliko ti ne treba tolika slucajnost nego ti treba samo pseudo random, onda /dev/urandom (ovaj ne blokira read() pozive ukoliko mu entropy pool nije zadovoljen). Najbolje kako sto je neko ranije reko man 4 random. Ali u principu ako nisi vezan za Windowsima, onda /dev/(u)random.
---------
To sto ti funkcija vracala istu vrednost prvih nekoliko puta to ti je posto je pozvana u istu sekundu, elem srand seed je pozvan istim parametrom. Tako da pokusaj da ubacis jedan sleep(1000) izmegju svakog poziva funkcije ako toliko zelis da exploatiras te funckije.
[ maxmagnus2 @ 17.11.2004. 10:22 ] @
Ne odgovara mi sleep,
jer hocu da imam mnogo rnd dogadjaja.
Cak mi je i ovaj nacin koji koristim spor.
Izgleda da su otprilike najbrze citanje iz rnd fajlova koje salju firme sa net-a.
MM
[ Riste Pejov @ 17.11.2004. 11:53 ] @
Posto se radi o Windows-ima, onda moze pokusati nesto ovako:
Code:
...
#include "sha.h"
...
char *GetRnd()
{
SHA_INFO sha;
FILETIME created, exited, kernel, user;
LONG val;
POINT point;
MEMORYSTATUS memoryStatus;
unsigned long tmp;
char *result ;
sha_init(&sha);
time_t now = time(NULL);
sha_update(&sha, (SHA_BYTE *)&now, sizeof(now));
tmp = (unsigned long)GetCurrentProcessId();
sha_update(&sha, (SHA_BYTE *)&tmp, sizeof(tmp));
tmp = (unsigned long)GetCurrentThreadId();
sha_update(&sha, (SHA_BYTE *)&tmp, sizeof(tmp));
/* Pored GetTickCount mozes upotrebiti
GetCapture, GetClipboardOwner, GetClipboardViewer, GetDesktopWindow, GetFocus,
GetInputState,GetMessagePos, GetMessageTime, GetOpenClipboardWindow,
GetProcessHeap,GetProcessWindowStation, GetActiveWindow
*/
tmp = (unsigned long) GetTickCount();
sha_update(&sha, (SHA_BYTE *)&tmp, sizeof(tmp));
GetCaretPos(&point);
sha_update(&sha, (SHA_BYTE *)&point, sizeof(point));
GetCursorPos( &point );
sha_update(&sha, (SHA_BYTE *)&point, sizeof(point));
GetProcessTimes(GetCurrentProcess(),
&created, &exited, &kernel, &user);
sha_update(&sha, (SHA_BYTE *)&created, sizeof(created));
sha_update(&sha, (SHA_BYTE *)&exited, sizeof(exited));
sha_update(&sha, (SHA_BYTE *)&kernel, sizeof(kernel));
sha_update(&sha, (SHA_BYTE *)&user, sizeof(user));
memoryStatus.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&memoryStatus);
sha_update(&sha, (SHA_BYTE *)&memoryStatus, sizeof(memoryStatus));
sha_final(&sha);
result = (char *)malloc(41); // SHA hash je 40 bajta + 1 za NUL termination
sprintf(result, "%08lx%08lx%08lx%08lx%08lx",
(unsigned long)sha.digest[0], (unsigned long)sha.digest[1],
(unsigned long)sha.digest[2], (unsigned long)sha.digest[3],
(unsigned long)sha.digest[4]);
return result;
}
E sada, posto tebi treba unsigned long za srand, onda samo XOR-uj sve bajte iz rezultata funkcije.
Imas sha kako attachment uz poruke :)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|