Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Losowanie liczby z określonym P
Forum PHP.pl > Forum > PHP
tmk
Witam, czy da się (używając funkcji php) wylosować liczbę z określonym prawdopodobieństwem?
Mam np: 0 i 1 i chcę losować 1 z P=0,6 i 0 z P=0.4..

Da się jakoś?
z góry dzięki
ActivePlayer
losuj 0 % 10 i potem dziel przez 10 ^^.

________

boze ale musialem byc zaspany jak to pisalem biggrin.gif:D
dr_bonzo
nie ma takiej funkcji, ale mozesz sobie sam napisac:
  1. <?php
  2. $pradwopodobienstwa[ 0 ] = 0.6;
  3. $pradwopodobienstwa[ 1 ] = 0.4;
  4. $wartosci[ 0 ] = 1;
  5. $wartosci[ 1 ] = 0;
  6.  
  7. $x = mt_rand( 0, 9999 )/10000; // EDIT: musi byc 9999 a nie 10000, bo mt_rand losuje z przedzialu [0, MAX] a nie 
    jak np w C [0, MAX)
  8.  
  9. echo &#092;"X = $x<br />\";
  10.  
  11. $suma_prawdopodobienstw = 0;
  12.  
  13. foreach ( $pradwopodobienstwa as $ii => $vv )
  14. {
  15.     $suma_prawdopodobienstw += $vv;
  16.     echo &#092;"suma: $suma_prawdopodobienstw ||  $x<br />\";
  17.     if ( $x < $suma_prawdopodobienstw )
  18.     {
  19.         print( &#092;"Wylosowano {$wartosci[ $ii ]}<br />\" );
  20.         break;
  21.     }
  22. }
  23. ?>


---------------------------------------------------
No i gotowa funkcja:
  1. <?php
  2. $data[ 0 ][ 0 ] = 0.6;
  3. $data[ 0 ][ 1 ] = 1;
  4. $data[ 1 ][ 0 ] = 0.4;
  5. $data[ 1 ][ 1 ] = 0;
  6.  
  7. print( 'Pojedyncze losowanie, wylosowano ' . differentRandom( $data ) . '<br />' );
  8.  
  9. $sumy[ 0 ] = 0;
  10. $sumy[ 1 ] = 0;
  11.  
  12. for ( $i = 0; $i < 10000; $i ++ )
  13. {
  14. $sumy[ differentRandom( $data ) ]++;
  15. }
  16.  
  17.  
  18. print( 'Rozklad prawdopodobienstwa z 10 000 losowan: <br />0: ' . ( $sumy[ 0 ]/( $sumy[ 0 ] + $sumy[ 1 ] ) ) . '<br />1: ' . ( $sumy[ 1 ]/( $sumy[ 0 ] + $sumy[ 1 ] ) ) );
  19.  
  20.  
  21.  
  22.  
  23.  
  24. /*
  25.  * Zwraca wylosowany obiekt dowolnego typu
  26.  * @param $dane array -- o wymiarach [ N ][ 2 ]
  27.  *  Array
  28.  *  (
  29.  *  [0] => Array
  30.  *  (
  31.  *  [0] => 0.6 // prawdopodobienstwo wylosowania 0go elementu
  32.  *  [1] => 1 // 0wy element, dowolnego typu
  33.  *  )
  34.  *  
  35.  *  [1] => Array
  36.  *  (
  37.  *  [0] => 0.4 // prawdopodobienstwo wylosowania 1go elementu
  38.  *  [1] => 0 // 1szy element, dowolnego typu
  39.  *  )
  40.  *  [...
  41.  *  )
  42.  * 
  43.  * Przy czym suma E( $dane[ i ] ) === 1, tutaj: 0.6 + 0.4 === 1
  44.  */
  45. function differentRandom( $data )
  46. {
  47. $random_number = floatval( mt_rand( 0, 9999 )/10000 ); // [ 0.0, 1.0 )
  48. $sum = 0;
  49.  
  50. foreach ( $data as $data_row )
  51. {
  52. $sum += $data_row[ 0 ];
  53.  
  54. if ( $random_number < $sum )
  55. {
  56. return $data_row[ 1 ]; // zwraca odpowiedni element
  57. }
  58. }
  59. }
  60. ?>
tmk
dzięki, pomogło biggrin.gif

pozdr
tmk
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-2025 Invision Power Services, Inc.