Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Küsimus C++ kohta märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Deadlock
Kreisi kasutaja

liitunud: 16.07.2004




sõnum 30.06.2008 16:36:39 Küsimus C++ kohta vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 30.06.2008 17:33:43 vasta tsitaadiga

Standardfunktsioon suudab ka, aga pea meeles, seemendama pead ainult ühe korra, programmi laadides. icon_biggrin.gif
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Deadlock
Kreisi kasutaja

liitunud: 16.07.2004




sõnum 30.06.2008 18:18:10 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 30.06.2008 18:57:36 vasta tsitaadiga

See randomi algoritm on nii keerukas, et vaevalt see "sõltuvus" silmaga nähtav on. icon_biggrin.gif
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 30.06.2008 19:34:09 vasta tsitaadiga

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++:
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <sys/time.h>
  4.  
  5. int main()
  6. {
  7.     struct timeval tv;
  8.  
  9.     ::gettimeofday(&tv, NULL);
  10.     ::srandom(tv.tv_usec);
  11.  
  12.     for (int i = 0; i < 10; i++)
  13.         std::cout << ::random() << "\n";
  14.  
  15.     return 0;
  16. }
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Deadlock
Kreisi kasutaja

liitunud: 16.07.2004




sõnum 30.06.2008 21:51:24 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 30.06.2008 22:53:34 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 01.07.2008 16:08:34 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
andreie
HV vaatleja
andreie

liitunud: 09.09.2006




sõnum 01.07.2008 16:46:50 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 01.07.2008 18:38:36 vasta tsitaadiga

Windowsi puhul sobib täpsema seemne saamiseks GetTickCount().
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Deadlock
Kreisi kasutaja

liitunud: 16.07.2004




sõnum 01.07.2008 21:07:39 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 01.07.2008 23:34:38 vasta tsitaadiga

Jah, teed funktsiooni staatilise muutuja - mingi flagi - a la:
c:
  1. int ran(int max)
  2. {
  3.     static int init_done = 0;
  4.  
  5.     if (!init_done)
  6.     {
  7.         srand(whatever);
  8.         init_done = 1;
  9.     }
  10.  
  11.     /* ... */
  12. }
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Deadlock
Kreisi kasutaja

liitunud: 16.07.2004




sõnum 02.07.2008 00:56:43 vasta tsitaadiga

Aga suured tänud! Sellest oli abi icon_wink.gif

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
vaata kasutaja infot saada privaatsõnum
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 02.07.2008 16:14:19 vasta tsitaadiga

Bluebull kirjutas:
Aga suured tänud! Sellest oli abi icon_wink.gif

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:
  1.  
  2. srand(time(NULL));
  3.  int ran(int max)
  4.    
  5.       {
  6.           return rand() % (max+1);
  7.  
  8.       }
  9.  


nii või naa sa seda uuesti ei seedi ju?
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 02.07.2008 17:25:35 vasta tsitaadiga

See on vigane kood. Funktsioone saab väljakutsuda ainult teiste funktsioonide sees.
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 02.07.2008 23:39:10 vasta tsitaadiga

troglodyte kirjutas:
See on vigane kood. Funktsioone saab väljakutsuda ainult teiste funktsioonide sees.

Sellist mõistet nagu pseudocode oled kuulnud? icon_biggrin.gif
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 02.07.2008 23:53:13 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 03.07.2008 11:44:38 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 03.07.2008 13:33:47 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Deadlock
Kreisi kasutaja

liitunud: 16.07.2004




sõnum 03.07.2008 14:42:30 vasta tsitaadiga

Ja sain ilusti teie abiga ka hakkama, end of story... icon_razz.gif
_________________
"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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Küsimus C++ kohta
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.