niedziela, 24 lipca 2016

C - Losowanie liczb pseudolosowych

Ten post będzie dotyczył metody jaką należy zastosować aby możliwe było losowanie liczb z określonego przez użytkownika przedziału za pomocą funkcji rand().

Jej zadaniem jest generacja liczby pseudolosowej. Poniżej przedstawię krótki program którego zadaniem będzie generacja przykładowych 10 liczb.



  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main()
  5. {
  6.     int i = 0;
  7.     srand(1);
  8.     for(i=1; i<=10; i++)
  9.     {
  10.         printf("Wywolanie %d wygenerowalo liczbe o wartosci: %d\n", i, rand());
  11.     }
  12.     return 0;
  13. }


Rys. 1. Wynik działania programu dla srand(time(0))

W przypadku wpisania do funkcji srand parametru stałego wynik działania programu byłby zawsze taki sam:

Rys. 2. Wynik działania programu dla srand(10)

Dodatkowa funkcją z jakiej należy skorzystać jest srand. Pozwala ona na ustawienie tzw. zarodka, dla generatora liczb pseudolosowych. Jako parametr można użyć liczby całkowitej, lub posłużyć sie funkcja time(0), która pobierze wartość czasu (w sekundach) jaka upłynęła od dnia 1 stycznia 1970 roku czasu uniwersalnego. 

Inicjowanie funkcji srand funkcją time(0) pozwala na zwiększenie elementu losowości w programie.

W celu wylosowanie liczby z interesującego użytkownika przedziału należy delikatnie zmodyfikować przedstawiony powyżej program. Przyjmijmy liczby z przedziału od 50 do 80.

  1. int main()
  2. {
  3.     int i = 0;
  4.  
  5.     srand(time(0));
  6.  
  7.     printf("Liczby pseudolosowe z przedziału od 50 do 80: \n");
  8.     for(i=1; i<=10; i++)
  9.     {
  10.         printf("Wywolanie %d wygenerowalo liczbe o wartosci: %d\n", i, 50 + rand() % 30);
  11.     }
  12.  
  13.     return 0;

Jeśli chce się uzyskać liczby z przedziału od 0 do zadanej wartości to można wykorzystać następujący sposób:

  1. int main()
  2. {
  3.     int i = 0;
  4.  
  5.     srand(time(0));
  6.  
  7.     printf("Liczby pseudolosowe z przedziału od 50 do 80: \n");
  8.     for(i=1; i<=10; i++)
  9.     {
  10.         printf("Wywolanie %d wygenerowalo liczbe o wartosci: %d\n", i, rand() % 81);
  11.     }
  12.  
  13.     return 0;
  14. }

Dla języka C++ sposób wykonania oraz funkcje są takie same. Dla pythona stosuje się funkcję random(), która wylosuje liczby z przedziału od 0 do 1. Do losowania liczb z przedziału wykorzystuje się funkcję randomint(), gdzie w nawiasie jest podawany początek i koniec przedziału.