Generarea de numere aleatoare (pseudo) aleatoare, c pentru oameni

În învățarea problemelor algoritmice, este adesea necesar să se genereze numere aleatorii. Desigur, le puteți obține de la utilizator, dar cu umplerea matricei cu numere aleatorii de 100 de bucăți, este posibil să aveți probleme.







Pentru a ne ajuta, vine funcția bibliotecii standard C (nu C ++) rand ().

Acesta generează un număr pseudo-aleator între 0 și RAND_MAX. Ultimul este o constantă, care variază în funcție de implementarea limbajului, dar în cele mai multe cazuri este de 32767.
Dacă avem nevoie de numere aleatorii de la 0 la 9? O modalitate obișnuită de ieșire din situație este utilizarea modulului modulo.

Dacă avem nevoie de numere de la 1 (și nu de la 0) la 9, atunci putem adăuga unul ...

Ideea este următoarea: generarea unui număr aleator de la 0 la 8 și după adăugarea lui 1 se transformă într-un număr aleator de la 1 la 9.

Și ultimul, cel mai trist.
Din păcate, funcția rand () generează numere pseudo-aleatoare, adică numere care par la întâmplare, dar de fapt sunt o secvență de valori calculate de un algoritm inteligent, ca parametru pentru așa-numita semințe. Ie Numerele generate de funcția rand () vor depinde de valoarea pe care o are kernel-ul în momentul în care este apelat. Și cerealele sunt întotdeauna stabilite de compilator la o valoare de 1. Cu alte cuvinte, secvența de numere va fi pseudo-aleatoare, dar întotdeauna aceeași.
Și asta nu este ceea ce avem nevoie.







Funcția srand () ajută la rezolvarea acestei situații.

void srand (semințe int nesemnate);

Setează boabele egale cu valoarea parametrului cu care a fost apelat. Și ordinea numerelor va fi, de asemenea, diferită.

Dar problema a rămas. Cum de a face un grăunte aleatoriu, pentru că totul depinde de ea?
Tipic din situație este utilizarea funcției time ().

time_t time (time_t * timer);

Acum putem trece valoarea acestei funcții la funcția srand () (se face o distribuție implicită) și vom avea o granulă aleatoră remarcabilă.
Iar numerele vor fi minunate și nu se vor repeta.

Pentru a utiliza funcțiile rand () și srand (), trebuie să includeți un fișier antet . și folosirea timpului () este un fișier .

Iată un exemplu deplin.

#include
#include
#include

folosind namespace std;

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

Iată codul pentru C ++ (compilator mingw):
#include
...
int RandomHi (int hi)
srand (GetTickCount ());
retur rand () hi;
>;

Va fi mai corect să folosiți GetTickCount (), deoarece în timp (NULL) valorile vor fi aceleași pentru o secundă, ceea ce este, în unele cazuri, inacceptabil.

Apropo, știi că, într-o astfel de abordare, densitatea distribuției unei variabile aleatorii nu va fi uniformă, dar va fi mutată spre un număr mai mic? De exemplu, pentru "rand ()% 100" probabilitatea de a obține un număr de la 0 la 67 inclusiv va fi puțin mai mare decât de la 68 la 99. Pentru un pas de 1000 în densitate între 767 și 768 va fi și mai vizibil.
Densitatea uniformă este obținută numai pentru divizori care sunt divizibili de puterile a două.
PS: Un "" nu poate fi folosit deloc. Este complet de neînțeles că tovarășul Radiocity avea acest lucru în minte.

Apoi întrebarea a apărut: dar este biți "AND" obținem numărul aleatoriu drept? La urma urmei, unele valori din domeniul țintă în general nu vor fi atinse.







Articole similare

Trimiteți-le prietenilor: