Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki, turiu klausimą kuris neduoda ramybės:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;

int rolldice();

int main()
{
   enum status {Win, Lose, Continue};
   int mypoint=0;
   status gamestatus;
   srand(time(0)); //KODĖL?
   int sumofdice=rolldice();
   switch ( sumofdice )
   {
   case 7:
   case 11:
       gamestatus = Win;
       break;
   case 2:
   case 3:
   case 12:
       gamestatus = Lose;
       break;
   default:
       gamestatus = Continue;
       mypoint=sumofdice;
       cout<<"Point is "<<mypoint<<endl;
       break;
   }
   while (gamestatus==Continue)
   {
       sumofdice = rolldice();
       if(sumofdice==mypoint)
           gamestatus=Win;
       if (sumofdice==7)
           gamestatus=Lose;
   }
   if (gamestatus==Win)
       cout<<"Player wins!"<<endl;
   else
       cout<<"Player loses."<<endl;

   return 0;
}

int rolldice()
{
   int die1=1+rand()%6;
   int die2=1+rand()%6;

   int sum = die1+die2;
   cout<<"Player rolled "<<die1<<"+"<<die2<<"="<<sum<<endl;
   return sum;
}

Kodėl įdėjus šią vietą:

srand(time(0));

keičiasi ir pačios funkcijos (rolldice()) vertė? Juk ji niekuo nusisijusi su ta funkcija. Mes juk nepateikiame šio kintamojo funkcijai.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

<...>

srand() yra susijusi su rand() metodu, placiau pasiskaityk kas per dalykas pseudo-random skaiciu generatoriuje yra seed, nes srand() butent ji ir nustato, del to keiciasi rand() metodo grazinamas rezultatas, to pasekoje ir pasikeicia ir to zaidimo rezultatas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kaip sakė hafnis, pseudo-random generatoriuose viskas turi prasidėt nuo tam tikro seed, o tada pagal tam tikrą algoritmą skaičiuojamos tolesnės reikšmės. Kompiuteriai yra deterministinės mašinos, todėl „tikro“ random jais pasiekti nelabai įmanoma.

 

Bet turbūt tau įdomiau, kaip funkcija, kuri negrąžina reikšmės, gali paveikti kitos funkcijos rezultatus. O tai gali būti labai paprasta:

int start = 123; // globalus kintamasis

void srand(int x) {
   // lokalaus kintamojo start nėra, todėl modifikuojamas globalus
   start = x;
}

int rand() {
   // čia vėl tas pats
   return ++start;
}

// Aišku, tai siaubinga PRNG implementacija :D

 

Funkcijos juk gali paveikti globalų state. Nepažiūrėjęs stdlib implementacijoj nežinosi, kaip tiksliai ten padaryta, bet turėtų būti kažkas panašaus.

 

Beje, tik dėl visa ko: turbūt visose standartinėse C bibliotekose rand() nėra kriptografiškai saugus PRNG. T.y., mokymuisi ar mažiems žaidimėliams kaip šis jis tinka, tačiau jį yra įmanoma nesunkiai nuspėti (priešingai, nei CSPRNG).

 

Jei kursi kažką rimto, o ypač susijusio su kriptografija, rand() yra netinkamas tiems reikalams (pvz., sugeneruoti slaptažodžiai, šifravimo raktai, ir pan., būtų nesaugūs)). O tuo labiau, kai jis užseedinamas dabartiniu laiku.

 

Jei neklystu, Windowsuose rimtiems random reikalams reiktų naudoti CryptGenRandom(), unix'uose - /dev/urandom (ar /dev/random (šis, nesant pakankamai entropy, laukia tol, kol jo pririnks)).

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...