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
<?php $pradwopodobienstwa[ 0 ] = 0.6; $pradwopodobienstwa[ 1 ] = 0.4; $wartosci[ 0 ] = 1; $wartosci[ 1 ] = 0; $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) $suma_prawdopodobienstw = 0; foreach ( $pradwopodobienstwa as $ii => $vv ) { $suma_prawdopodobienstw += $vv; if ( $x < $suma_prawdopodobienstw ) { break; } } ?>
<?php $data[ 0 ][ 0 ] = 0.6; $data[ 0 ][ 1 ] = 1; $data[ 1 ][ 0 ] = 0.4; $data[ 1 ][ 1 ] = 0; $sumy[ 0 ] = 0; $sumy[ 1 ] = 0; for ( $i = 0; $i < 10000; $i ++ ) { $sumy[ differentRandom( $data ) ]++; } print( 'Rozklad prawdopodobienstwa z 10 000 losowan: <br />0: ' . ( $sumy[ 0 ]/( $sumy[ 0 ] + $sumy[ 1 ] ) ) . '<br />1: ' . ( $sumy[ 1 ]/( $sumy[ 0 ] + $sumy[ 1 ] ) ) ); /* * Zwraca wylosowany obiekt dowolnego typu * @param $dane array -- o wymiarach [ N ][ 2 ] * Array * ( * [0] => Array * ( * [0] => 0.6 // prawdopodobienstwo wylosowania 0go elementu * [1] => 1 // 0wy element, dowolnego typu * ) * * [1] => Array * ( * [0] => 0.4 // prawdopodobienstwo wylosowania 1go elementu * [1] => 0 // 1szy element, dowolnego typu * ) * [... * ) * * Przy czym suma E( $dane[ i ] ) === 1, tutaj: 0.6 + 0.4 === 1 */ function differentRandom( $data ) { $sum = 0; foreach ( $data as $data_row ) { $sum += $data_row[ 0 ]; if ( $random_number < $sum ) { return $data_row[ 1 ]; // zwraca odpowiedni element } } } ?>