C/rand
Z Wikibooks, biblioteki wolnych podręczników.
Spis treści |
[edytuj] Deklaracja
- int rand(void)
[edytuj] Plik nagłówkowy
[edytuj] Opis
- Funkcja zwraca kolejną liczbę pseudolosową. Aby ustawić zarodek 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.
[edytuj] Wartość zwracana
- Liczba pseudolosowa z przedziału od 0 do RAND_MAX (które ma wartość co najmniej 32767).
[edytuj] Przykład użycia
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i;
srand(time(0));
for(i=0; i<10; ++i) {
printf("%d. liczba pseudolosowa to %d\n", i, rand());
}
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));
return 0;
}
Funkcja pozwalająca losować liczby z dowolnego zakresu.
int rnd(int min, int max) {
if (max>=min) {
max -= min;
} else {
int tmp = min - max;
min = max;
max = tmp;
}
return max ? rand() % max + min : min;
}
[edytuj] Uwagi
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.