Keresés

Új hozzászólás Aktív témák

  • dabadab

    titán

    válasz Dave-11 #1830 üzenetére

    Az srand() inicializalja a randomgeneratort, ezt csak egyszer kell megcsinalni, praktikusan a program elejen. Ez altalaban nem tul bonyolult kod es elmondhato rola, hogy ha ugyanazzal a szammal inicializalod, akkor utana pontosan ugyanazokat a "veletlen" szamokat fogod kapni, ezert nepszeru megoldas, hogy a jelenlegi idovel inicializaljak, valahogy igy: srand( time() );

    A rand() meg ezek utan egyszeruen visszaad egy veletlenszamot (ami a 0 - RAND_MAX intervallumba esik).

    Ha intervallumot akarsz (mondjuk X es X+Y koze), akkor az egyszeru, ertheto es naiv megoldas az, hogy a rand altal visszaadott szamnak az Y-nal valo osztasanak a maradekat veszed es hozzaadod X-et. Konkretan a te peldadban (1-50, ahol X = 1 es Y = 49):
    int random_number = rand() % 49 + 1;

    Es akkor most egy kicsit kenytelen vagyok arrol szolni, hogy valojaban miert istentelen nagy szivas ez az egesz veletlenszam-temakor: a fenti peldaban, ha Y nem ketto valamelyik egesz szamu hatvanya (1, 2, 4, 8, 16 stb), akkor a veletlen szamaid eloszlasat megnezve fel fog tunni, hogy nem azonos esellyel kapod a szamokat, hanem lesz egy hatar es az alattiak valamivel nagyobb valoszinuseggel fordulnak elo. A miert megmagyarazasat az olvasora bizom :)

    A masik problema meg a kiszamithatosag: a Firefoxban (illetve akkor meg Mozillanak hivtak) volt egy olyan biztonsagi hiba, hogy a fenti modon inicializalta a randomgeneratort amikor titkositashoz generalt veletlenszamokat. Csakhogy - a fentiek miatt - a tamadonak eleg volt azt kitalalnia, hogy milyen idot mutatott a gep oraja, amikor legeneralta a titkositashoz szukseges szamokat, marpedig ha egy titkositott kapcsolatot 12:54-kor kezd a bongeszo, akkor jo esellyel a gep oraja is 12:54-et fog mutatni, vagy akornyeken valamit - es mivel a time() felbontasa csak masodperces, ezert nem is kellett olyan tul sok szamot vegigprobalni ahhoz, hogy fel lehessen torni a titkositast.

    Szoval a veletlenszamgeneralas nehez problema, ahol komolyan erre van szukseg, ott valami plusz hardverrel generaljak, ami valami kellokeppen veletlenszeru fizikai folyamaton alapszik.

    szerk: Latom, en irtam a legtobb ideig, de legalabb latszatja is van :D

  • kispx

    addikt

    válasz Dave-11 #1830 üzenetére

    srand(); inicializálja a randomszámgenerátort. Mindig a legelső szám generálása előtt kell ezt megtenni.

    "srand(12);" Konstanssal nem illik inicializálni, mert minden egyes futás során ugyanazokat a számokat fogja előállítani. Helyette olyan módszert kell választani, ami futásról futásra változik, pl idő:
    srand ( time(NULL) );

    rand(), egy véletlen számot fog visszaadni 0 és RAND_MAX között.

    Ha kisebb értéktartományon szeretnénk véletlen számot generálni akkor, akkor egy X számmal kell a maradékát képezni, pl

    rand() % X ez [0; X-1] tartományban képez egy véletlen számot

    Szerk.: látom túl sokáig írtam a hszt :)

  • Karma

    félisten

    válasz Dave-11 #1830 üzenetére

    srand és rand.

    A srand(12)-vel mindig ugyanazokat a számokat fogod kapni, de ezt beláthatod, amint elolvastad a felső két linket.

    Megadni meg nem tudod, helyette a % (modulo) operátorral csinálhatsz neked kellőt. Esetleg egyet hozzáadva, hogy jó offszet legyen.

Új hozzászólás Aktív témák