Biblioteka standardowa » Stdlib.h

Rand

  • 2010-10-31 18:27
  • 1 komentarz
  • 9963 odsłony
  • Oceń ten tekst jako pierwszy
int rand(void);

Funkcja rand() zwraca kolejną pseudolosową liczbę całkowitą z przedziału <0, RAND_MAX>, gdzie RAND_MAX ma wartość co najmniej 32767. Funkcja nie przyjmuje żadnego argumentu.

    Aby przy każdym uruchomieniu aplikacji losowane były inne liczby, należy ustawić tzw. zarodek ciągu liczb pseudolosowych (→ zobacz srand).
    Aby otrzymać liczbę z przedziału mniejszego niż <0, RAND_MAX>, należy użyć operatora reszty z dzielenia całkowitego, modulo (%), pisząc go zaraz po nazwie funkcji rand() wraz z górną granicą przedziału.
    Jeżeli z kolei chcemy uzyskać liczbę z przedziału zaczynającego się od innej wartości niż zero, wystarczy zwiększyć wynik losowania o tą wartość.

Przykład wykorzystania funkcji rand()


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(int argc, char* argv[])
{
  int i;
  srand(time(0));  /* ustawienie zarodka */
 
  /* losowanie liczby z zakresu <0,RAND_MAX> */
  printf("Za %d lat nastapi koniec swiata!\n", rand());
 
  /* losowanie liczby z zakresu <0,300> */
  printf("A czy wiesz, że spartan nie było 300, a zaledwie %d\n?", rand() % 301);
 
  /* losowanie pięciu liczb z zakresu <1,49> */
  printf("W dzisiejszym losowaniu Duzego Lotka wylosowano nastepujace liczby:\n");
  for (i=1; i<6; i++)
    printf("%d\t", 1 + rand() % 49);  /* losowanie liczby z przedziału <1,49> */
 
  /* losowanie liczby z zakresu <1,36> */
  printf("Z kolei Twoj Szczesliwy Numerek to: %d\n", 1 + rand() % 36);
  return 0;
}

Uzyskiwanie bardziej losowych liczb pseudolosowych


<justify>    Do tej pory stosowaliśmy jedynie całkowite zakresy dla losowanych liczb. Okazuje się jednak, że operator modulo (%) powoduje, że pod uwagę brane są mniej znaczące bity, które są znacznie mniej losowe od bitów bardziej znaczących. Jest to błędem starszych interpretacji funkcji rand(), który jednak można łatwo wyeliminować, stosując operacje na liczbach rzeczywistych.</justify>
Dla przykładu, bardziej sugerowane jest użycie
   
int szczesliwy_numerek = 1 + (int)(rand() / (RAND_MAX + 1.0) * 36);  /* losowanie liczby z zakresu <1,36> */

zamiast:
   
int szczesliwy_numerek = 1 + rand() % 36;  /* losowanie liczby z zakresu <1,36> */

    Generalnie jednak, nie ma znaczenia, z którego rozwiązania skorzystamy. Standardowy generator liczb pseudolosowych w języku C jest na tyle niedoskonały, że jeżeli planujemy opracować aplikację, która będzie opierała się na liczbach pseudolosowych z prawdziwego zdarzenia, warto opracować, bądź też użyć innej implementacji takowego generatora.
    Więcej na temat metody działania generatora licz pseudolosowych można znaleźć na wikipedii.

Własna interpretacja funkcji losującej liczbę z danego zakresu


int xrand (int range_min, int range_max)
{
  int tmp_range;
  /* jeżeli maksymalny zakres jest większy/równy minimalnemu, wtedy zmniejszamy jego wartość o wartość zakresu minimalnego */
  if ( range_max >= range_min ) range_max -= range_min;
  else
  {
    /* jeżeli zakres maksymalny ma mniejszą wartość niż minimalny, obliczamy różnice miedzy zakresami...*/
    range_tmp = range_min - range_max;
    range_min = range_max;  /* ... a następnie zamieniamy je miejscami */
    range_max = tmp_range;
  }
  /* jeżeli zakres maksymalny jest <> 0, wtedy funkcja zwróci liczbę losową z danego zakresu
   * w przeciwnym wypadku zwróci wartość podaną jako zakres minimalny */
  return (int)(range_max ? range_min + rand() / (RAND_MAX + 1.0) * (double) range_max : range_min);
}




Zobacz też:

1 komentarz

IceHeart 2014-04-05 14:30

Przydało się, dzięki wielkie :)