Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Deadlock
Kreisi kasutaja
liitunud: 16.07.2004
|
30.06.2008 16:36:39
Küsimus C++ kohta |
|
|
Kas kellelgi on C++'is mõni random funktsioon, mis suudaks samal sekundil luua erinevaid numbreid? Proovisin ise kirjutada, aga veidi bugiseks jääb ja numbrid korduvad väikse vahemaa tagant.
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
maxorator
HV kasutaja
liitunud: 30.08.2006
|
30.06.2008 17:33:43
|
|
|
Standardfunktsioon suudab ka, aga pea meeles, seemendama pead ainult ühe korra, programmi laadides.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
Deadlock
Kreisi kasutaja
liitunud: 16.07.2004
|
30.06.2008 18:18:10
|
|
|
Ta ju ei suuda samal sekundil mitut random arvu luua, mis üksteisest ei sõltuks..
_________________ "Believe you can, believe you can't; either way, you're right." - Henry Ford |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
maxorator
HV kasutaja
liitunud: 30.08.2006
|
30.06.2008 18:57:36
|
|
|
See randomi algoritm on nii keerukas, et vaevalt see "sõltuvus" silmaga nähtav on.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
30.06.2008 19:34:09
|
|
|
Arvatavasti kasutad sa random()/srandom() funktsioone kuidagi valesti või ebaeffektiivselt.
Või tahad öelda, et järgmine koodilõik väljastab igal käivitamisel samu numbreid?
c++:
|
#include <iostream> #include <stdlib.h> #include <sys/time.h> int main() { struct timeval tv; ::gettimeofday(&tv, NULL); ::srandom(tv.tv_usec); for (int i = 0; i < 10; i++) std::cout << ::random() << "\n"; return 0; }
|
|
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
Deadlock
Kreisi kasutaja
liitunud: 16.07.2004
|
30.06.2008 21:51:24
|
|
|
Mul dev-C++ ei tunnegi selliseid asju ära nagu random() ja srandom() ja antud kood tööle ei lähe :/
Oskan kasutada rand() ja srand()... mis aga saavad oma väärtused arvuti kellaaja abil ja seega ei suuda ühel ja samal sekundil erinevaid väärtuseid luua.
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
30.06.2008 22:53:34
|
|
|
Leia siis parem seemendamise viis kui time(0), nagu minu näites gettimeofday() abil saadud info.
Kas ma saa õieti aru et sa kutsud srand() alati enne rand()-i? Sellisel juhul sa loomulikult saad sekundi jooksul samad arvud kuna üks ja sama seed panevad RNG samasse olekusse.
Nagu maxorator ütles, seemendama pead ainult ühe korra.
Probleemi ülesleidmisel oleks hea kui sa vastava koodi siia ülespaneksid.
|
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
maxorator
HV kasutaja
liitunud: 30.08.2006
|
01.07.2008 16:08:34
|
|
|
Bluebull kirjutas: |
Mul dev-C++ ei tunnegi selliseid asju ära nagu random() ja srandom() ja antud kood tööle ei lähe :/
Oskan kasutada rand() ja srand()... mis aga saavad oma väärtused arvuti kellaaja abil ja seega ei suuda ühel ja samal sekundil erinevaid väärtuseid luua. |
Iga uue randomi genereerimisel asendab seemne uue vastu, seega sa teed järelikult midagi valesti.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andreie
HV vaatleja

liitunud: 09.09.2006
|
01.07.2008 16:46:50
|
|
|
Bluebull, kas käivitad programmi ühe sekundi jooksul mitu korda? Kui see probleemiks, kasuta lihtsalt täpsemat kellaaega, näiteks millisekundites. Mis opsüsteem sul on?
Muide, õige on juhuslike arvude generaatorit kasutada nii:
1. programm alguses srand()
2. edaspidi rand() ja rand() ja rand()...
Mitu korda srand()-imine rikub juhuslikkuse ära.
_________________ Unix survives only because everyone else has done so badly. |
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
maxorator
HV kasutaja
liitunud: 30.08.2006
|
01.07.2008 18:38:36
|
|
|
Windowsi puhul sobib täpsema seemne saamiseks GetTickCount().
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
Deadlock
Kreisi kasutaja
liitunud: 16.07.2004
|
01.07.2008 21:07:39
|
|
|
Ma tahaksin teha funktsiooni, mida oleks edaspidi lihtne kasutada ja saaks esile kutsuda nii: ran(Max väärtus); // mis loob täisarvu nullist max väärtuseni
Kuna, aga, oleks seda sama funktsiooni mõnes programmis vaja mitu korda esile kutsuda samal sekundil ja "srand()" peab asuma seal funktsioonis, siis on veidi probleeme sellega, et ta samal sekundil erinevaid numbreid looks, kuna programm loeb srand() ka alati uuesti... Kas on lihtsat võimalust teha nii, et ta vaid ühe korra seda läbiks? (Nii, et ta jääks siiski selle funktsiooni sisse )
_________________ "Believe you can, believe you can't; either way, you're right." - Henry Ford |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
01.07.2008 23:34:38
|
|
|
Jah, teed funktsiooni staatilise muutuja - mingi flagi - a la:
c:
|
int ran(int max) { static int init_done = 0; if (!init_done) { srand(whatever); init_done = 1; } /* ... */ }
|
|
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
Deadlock
Kreisi kasutaja
liitunud: 16.07.2004
|
02.07.2008 00:56:43
|
|
|
Aga suured tänud! Sellest oli abi
Kood siis selline:
int ran(int max)
{
int s;
static int init_done = 0;
if (!init_done){
srand(time(NULL));
init_done = 1;
}
s = rand() % (max+1);
return s;
}
|
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
02.07.2008 16:14:19
|
|
|
Bluebull kirjutas: |
Aga suured tänud! Sellest oli abi
Kood siis selline:
int ran(int max)
{
int s;
static int init_done = 0;
if (!init_done){
srand(time(NULL));
init_done = 1;
}
s = rand() % (max+1);
return s;
}
|
|
kas nii mitte parem poleks?
c:
|
srand(time(NULL)); int ran(int max) { return rand() % (max+1); }
|
nii või naa sa seda uuesti ei seedi ju?
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
02.07.2008 17:25:35
|
|
|
See on vigane kood. Funktsioone saab väljakutsuda ainult teiste funktsioonide sees.
|
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
maxorator
HV kasutaja
liitunud: 30.08.2006
|
02.07.2008 23:39:10
|
|
|
troglodyte kirjutas: |
See on vigane kood. Funktsioone saab väljakutsuda ainult teiste funktsioonide sees. |
Sellist mõistet nagu pseudocode oled kuulnud?
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
02.07.2008 23:53:13
|
|
|
Ma arvan et see ei olnud pseudokood ning on suht mõttetu kui oleks, arvestades siin juba varem kirjutatud juttu.
Või kui arvad, et see on pseudokood siis kuidas see c++ koodi peaks transleeruma ja Bluebull probleemile lahendust tooma?
|
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
maxorator
HV kasutaja
liitunud: 30.08.2006
|
03.07.2008 11:44:38
|
|
|
Pseudocode ei ole programmeerimiskeel. See on üldnimetus koodijupile, mis annab ülevaate, kuidas mingit asja teha, kuid jätab välja tahetud asjaga otseselt mitte seotud osad. See võib olla mingis kindlas progemiskeeles, kuid ei pea olema.
Wikipedia kirjutas: |
Pseudocode (derived from pseudo and code) is a compact and informal high-level description of a computer programming algorithm that uses the structural conventions of some programming language, but typically omits details that are not essential for the understanding of the algorithm... |
Ehk siis, on loogiline, et funktsioonist välja asetatud koodijupp pseudocodes tuleb asetada sinna, kuhu teemaalgataja ise seda panna tahab, seega kas mingisse laadimisfunktsiooni või main funktsiooni.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
03.07.2008 13:33:47
|
|
|
Põhimõtteliselt on sul õigus kuid Bluebull sooviga see siiski ei ühti, vähemalt nii nagu ma aru olen saanud.
Ta soovis kompaktselt kogu kraami ühte funktsiooni toppida.
|
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
Deadlock
Kreisi kasutaja
liitunud: 16.07.2004
|
03.07.2008 14:42:30
|
|
|
Ja sain ilusti teie abiga ka hakkama, end of story...
_________________ "Believe you can, believe you can't; either way, you're right." - Henry Ford |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
|