C/rand

Z Wikibooks, biblioteki wolnych podręczników.

< C

Spis treści

[edytuj] Deklaracja

int rand(void)


[edytuj] Plik nagłówkowy

stdlib.h


[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.

[edytuj] Zobacz też