Generálása (ál) véletlen számokat, c az emberek

A képzés algoritmikus rejtvények gyakran annak szükségességét, hogy véletlenszerű egészek. Persze, lehet kapni őket a felhasználó, de kitölteni egy tömböt véletlen számok összege 100 db lehet probléma.

Hogy segítsen nekünk függvényében nyelv alapkiépítésben C könyvtár (C ++) rand ().

Ez létrehoz egy pszeudo-véletlen egész tartományban 0-tól RAND_MAX közé fog esni. Az utóbbi egy konstans függ az implementációs nyelvvel, de a legtöbb esetben a 32.767.
De mi van, ha szükségünk van egy véletlen számot 0-9? Tipikus kiút -, hogy használja a modulo művelet részlege.

Ha szükségünk van egy szám 1-től (nem 0), 9, felveheti yedinichku ...

Az ötlet: generál egy véletlen számot 0-8, hozzáadunk 1 kiderül egy véletlen számot 1-9.

Végül a legszomorúbb.
Sajnos, rand () függvény generál véletlen számokat, azaz a megjelenő számok véletlenszerű, de valójában egy érték szekvencia számítva trükkös algoritmus, mint a paraméter részesülő ún gabona (mag). Ie generált függvény rand () szám értékétől függően, amely egy gabona pillanatában a hívást. A gabona fordítóprogram mindig 1. Más szóval, a sorszámokat egy pszeudo-véletlen, bár, de mindig ugyanaz.
És ez nem erre van szükségünk.

Orvosolja a helyzetet segíti a srand függvény ().

void srand (unsigned int mag);

Ez határozza meg a gabona egy paraméter értékét, amelyet hívott. És egy számsor lesz más is.

De a probléma megmaradt. Hogyan készítsünk egy véletlen mag, mert minden attól függ, hogy ez?
Jellemző hozama a helyzet - használat függvényében time ().

time_t idő (time_t * timer);

Most az értéke ennek a funkciónak, tudjuk átadni srand () függvény (ebben az esetben egy implicit típusú cast), és mi lesz egy csodálatos véletlen vetőmagot.
És a számok méltó és visszatérő.

Ahhoz, hogy a rand () és srand () bele kell foglalni a header fájlt . és a time () használja - file .

Itt van egy komplett példa.

#include
#include
#include

using namespace std;

int main ()
<
cout <<"10 random numbers (1..100): " < srand (time (NULL));
A (int i = 0; i<10;i++) cout < cin.get ();
vissza 0;
>

Itt van a kód a C ++ (mingw compiler):
#include
...
int RandomHi (int hi)
srand (GetTickCount ());
vissza rand () hi;
>;

Bölcs dolog, hogy használja a GetTickCount (), mert abban az esetben a time (NULL) érték egy második ugyanaz lesz, ami elfogadhatatlan bizonyos sluagh.

És mellesleg, tudod, hogy ez a megközelítés a sűrűsége a véletlen változó eloszlása ​​nem lesz egyenletes, és elfogultak kisebb számban? Például, a «rand ()% 100" a valószínűsége, hogy több 0-67 befogadó, kissé magasabb lesz, mint a 68 99. 1000 lépés sűrűsége közötti 767 és 768 lesz észrevehető.
Egyenletes sűrűségű csak osztói többszöröse hatásköre kettő.
PS: A „” nem lehet használni egyáltalán. Teljesen érthetetlen, hogy Radiocity elvtárs volt erre a szem előtt.

Itt egy kérdés: A bitenkénti „és a” mi fogja elérni a kívánt véletlen számot? Végtére is, néhány érték a cél tartományban egyáltalán lesz elérhetetlen.

Kapcsolódó cikkek