Przejdź do zawartości

C/rand

Z Wikibooks, biblioteki wolnych podręczników.
< C

Deklaracja

[edytuj]
int rand(void)

Plik nagłówkowy

[edytuj]
stdlib.h

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.

Zobacz też

[edytuj]