Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Losowanie liczb wg prawdopodobieństwa
Forum PHP.pl > Forum > Gotowe rozwiązania
tomxx
Mam prostą funkcję służącą do losowania czegokolwiek z określonym prawdopodobieństwem.

  1. <?php
  2.  
  3. function los(){return rand(1, 1000000000) / 1000000000;}
  4.  
  5. function sumowanie($tablica, $ileElementów) {
  6. $liczbaIteracji = 0;
  7. $wynik = 0;
  8. foreach($tablica as $liczba) {
  9. $liczbaIteracji++;
  10. $wynik += $liczba;
  11. if($liczbaIteracji == $ileElementów) break;
  12. }
  13. return $wynik;
  14. }
  15.  
  16. function losowanie($tablica) {
  17.  
  18. $liczbaIteracji = 0;
  19. $los = los() * (1 - array_sum($tablica));
  20.  
  21. foreach ($tablica as $klucz=>$liczba) {
  22.  
  23. if($los < sumowanie($tablica, $liczbaIteracji+1)) {
  24. return $klucz;
  25. break;
  26. }
  27.  
  28. $liczbaIteracji++;
  29. }
  30. }
  31.  
  32. echo losowanie(["1"=>0.2, "2"=>0.8]);
  33. ?>


Powyższy przykład powinien w 20% przypadków wyświetlić 1, a w 80% 2. Oczywiście zamiast liczb można podawać wszelkie inne typy danych.
Ponadto jeśli suma elementów tablicy podanej jako argument nie jest równa 1, to skrypt sam sobie z tym poradzi (["1"=>0.1, "2"=>0.4] będzie oznaczało tyle co ["1"=>0.2, "2"=>0.8]).
Crozin
1. Losowanie liczby z przedziału 0.0 - 1.0:
  1. mt_rand() / mt_getrandmax(); // [0.0; 1.0]
  2. mt_rand(0, mt_getrandmax() - 1) / mt_getrandmax(); // [0.0; 1.0)
  3. lcg_value(); // (0.0; 1.0)

2. Zakładając, że jako argument przekażesz tablicę, której wartości to kolejne dopełnienia do 1, tj. w tym przypadku będzie to "1" => 0.2, "2" => 1.0 (nie 0.8) wystarczy wylosować liczbę, a następnie w pętli sprawdzić czy dana para klucz-wartość ma wartość mniejszą lub równą wylosowanej liczbie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.