nie ma takiej funkcji, ale mozesz sobie sam napisac:
<?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)
echo \"X = $x<br />\";
$suma_prawdopodobienstw = 0;
foreach ( $pradwopodobienstwa as $ii => $vv )
{
$suma_prawdopodobienstw += $vv;
echo \"suma: $suma_prawdopodobienstw || $x<br />\"; if ( $x < $suma_prawdopodobienstw )
{
print( \"Wylosowano {$wartosci[ $ii ]}<br />\" ); break;
}
}
?>
---------------------------------------------------
No i gotowa funkcja:
<?php
$data[ 0 ][ 0 ] = 0.6;
$data[ 0 ][ 1 ] = 1;
$data[ 1 ][ 0 ] = 0.4;
$data[ 1 ][ 1 ] = 0;
print( 'Pojedyncze losowanie, wylosowano ' . differentRandom
( $data ) . '<br />' );
$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
}
}
}
?>
Ten post edytował dr_bonzo 13.11.2004, 10:46:24