C/rand
Deklaracja
[edytuj]- int rand(void)
Plik nagłówkowy
[edytuj]Opis
[edytuj]- Funkcja zwraca kolejną liczbę pseudolosową. Aby ustawić zarodek/nasiono(seed) ciągu liczb pseudolosowych, należy posłużyć się funkcją srand. Aby otrzymać liczbę z mniejszego przedziału, należy posłużyć się operatorem modulo (%) lub operacjami na liczbach rzeczywistych.
Wartość zwracana
[edytuj]- Liczba pseudolosowa z przedziału od 0 do RAND_MAX (które ma wartość co najmniej 32767).
Przykład użycia
[edytuj]#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i, zarodek;
time_t tt;
zarodek = time(&tt);
srand(zarodek); // za zarodek wstawiamy pobrany czas w sekundach
for(i= 1; i<= 5; ++i)
printf("%d. liczba pseudolosowa to %d\n", i, rand());
// przyklad dla ograniczonego przedzialu
printf("Liczba pseudolosowa z przedziału <0, 99> to %d\n", rand()%100);
printf("Liczba pseudolosowa z przedziału <0, 99> to %d\n",
(int)(rand() / (RAND_MAX + 1.0) * 100.0));
// przyklad jak wplywa zarodek na wynik losowania
zarodek= 1337;
srand(zarodek);
printf("Dwie pseudolosowe liczby dla zarodka %d to: %d, %d\n", zarodek, rand(), rand());
srand(zarodek);
printf("Dwie pseudolosowe liczby dla zarodka %d to: %d, %d\n", zarodek, rand(), rand());
return 0;
}
1. liczba pseudolosowa to 2406 2. liczba pseudolosowa to 27539 3. liczba pseudolosowa to 27697 4. liczba pseudolosowa to 601 5. liczba pseudolosowa to 3977 Liczba pseudolosowa z przedzialu <0, 99> to 65 Liczba pseudolosowa z przedzialu <0, 99> to 1 Dwie pseudolosowe liczby dla zarodka 1337 to: 25954, 4404 Dwie pseudolosowe liczby dla zarodka 1337 to: 25954, 4404
Funkcja pozwalająca losować liczby z dowolnego zakresu.
int random(int min, int max)
{
int tmp;
if (max>=min)
max-= min;
else
{
tmp= min - max;
min= max;
max= tmp;
}
return max ? (rand() % max + min) : min;
}
Uwagi
[edytuj]Użycie operacji na liczbach rzeczywistych jest często sugerowane, gdyż w przeciwieństwie do operacji modulo bierze pod uwagę bardziej znaczące bity wygenerowanej liczby, które teoretycznie są bardziej losowe od bitów mniej znaczących. Istotnie może to być prawdą, jednak nie ma to i tak większego znaczenia, gdyż jeżeli zależy nam na dużej losowości generatora powinniśmy w programie użyć innej implementacji generatora. Generalnie generator z biblioteki standardowej nie nadaje się do bardzo poważnych zastosowań.
Należy pamiętać, że jeżeli górny zakres do którego losujemy jest bliski wartości RAND_MAX to liczby nie będą miały równomiernego rozkładu prawdopodobieństwa. Jest to prawdą dla każdej granicy, która nie jest dzielnikiem RAND_MAX+1, jednak przy małych wartościach niedokładność jest pomijalna.