| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

09-06-2009, 06:46
|
|
OneWayUserAcci
Registrierter Benutzer
|
|
Registriert seit: Dec 2008
Beiträge: 16
|
|
Große Zufallszahlen - Eintrittswahrscheinlichkeit
Hallo,
Ich bin am überlegen sowie auf der Suche nach einer Pseudo-Zufalls-Funktion, die für große Zahlen gedacht ist. Dabei soll man den Range-Wert einstellen können, wie bei (mt_)rand. Die bisherigen Funktionen, die ich gefunden habe, sind ein wenig zu sehr abweichend von der Verteilung der Zahlen in Bezug auf (mt_)rand.
Desweiteren such ich nach einer einfachereren Lösung für folgendes Szenario bzgl. Eintrittswahrscheinlichkeit bei unterschiedlichen Werten. Der Value-Parameter definiert hier die Chance des Eintretens, des jeweiligen Datensatzes.
PHP-Code:
$users = array(
'A' => '100',
'B' => '2000',
'C' => '30000',
'D' => '400000',
'E' => '5000000',
);
$maximum = array_sum_bignum($users);
$number = mt_rand_bignum('1', $maximum);
$users = shuffle_keep_keys($users);
$count = '0';
foreach($users AS $name => $value)
{
$min = bcadd($count, '1');
$count = bcadd($count, $value);
$max = $count;
if(($min <= $number) AND ($max >= $number))
{
//echo $min . '' . $max . '' . $value;
break;
}
}
|

09-06-2009, 09:55
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Ich mag große Zahlen, auch Zufallszahlen und so wieter, aber von dem was du da möchtest, verstehe ich nix! Auch die Funktionen welche da bei dir zum Einsatz kommen habe ich noch nie gesehen.
|

09-06-2009, 13:00
|
|
OneWayUserAcci
Registrierter Benutzer
|
|
Registriert seit: Dec 2008
Beiträge: 16
|
|
Das sind zwei verschiedene Dinge. Beim Ersten gehts nur um den Generator, womit ich größere/kleinere Zahlen rauskriegen möchte als (-)2^31-1. Das Zweite hat mit dem Ersten nur in der Hinsicht was zu tun, weil es um größere Zufallswerte geht. Die Funktionen array_sum_bignum/mt_rand_bignum sind dieselbige wie array_sum/mt_rand, nur mit größeren Werten, wobei die Funktion für die großen Zufallszahlen noch nicht vorhanden ist. Die Funktion shuffle_keep_keys sorgt nur dafür, dass beim Sortieren mit shuffle die Array-Schlüssel erhalten bleiben.
Geändert von OneWayUserAcci (09-06-2009 um 13:07 Uhr)
|

09-06-2009, 13:23
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von OneWayUserAcci
Das sind zwei verschiedene Dinge. Beim Ersten gehts nur um den Generator, womit ich größere/kleinere Zahlen rauskriegen möchte als (-)2^31-1.
|
PHP-Code:
echo mt_rand(0, pow(2, 60));
// 1070457797516197888
echo mt_rand(0, pow(2, 60));
// 426054254793326592
echo mt_rand(0, pow(2, 60));
// 939119261509484544
|

09-06-2009, 13:34
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
@h3ll
PHP: mt_getrandmax - Manual
Da hasste wohl ein 64 Bit System 
Das hat aber nicht jeder.
PHP-Code:
echo mt_rand(0, pow(2, 60)).'<br>';
echo mt_rand(0, pow(2, 60)).'<br>';
echo mt_rand(0, pow(2, 60)).'<br>';
echo mt_rand(0, pow(2, 60)).'<br>';
echo mt_rand(0, pow(2, 60)).'<br>';
Liefert bei mir IMMER und konsequent 0. Nix anderes.
|

09-06-2009, 13:42
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von combie
|
Tja, wer hat, der hat
64-Bit Prozessoren kriegt man inzwischen eh schon nachgeschmissen.
|

09-06-2009, 13:51
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Aus meiner Wühlkiste:
PHP-Code:
function bc_rand($start,$end,$scale=null)
{
if(is_null($scale))
{
if(bccomp($start,$end) >= 0)
throw new Exception('Left Value must be lower');
}else
{
if(bccomp($start,$end,$scale) >= 0)
throw new Exception('Left Value must be lower');
}
$result = '';
if(is_null($scale))
{
$diff = bcsub($end,$start);
}else
{
$diff = bcsub($end,$start,$scale);
}
$begrenzt = true;
for($i=0;$i<strlen($diff);$i++)
{
$ziffer = $diff{$i};
if($ziffer === '.')
{
$result .= '.';
}else
{
if($begrenzt)
{
$neue = mt_rand(0,$ziffer);
if($neue < $ziffer) $begrenzt = false;
}else
{
$neue = mt_rand(0,9);
}
$result .= $neue;
}
}
$result = ltrim($result,'0');
if(0 === strpos($result,'.')) $result = '0'.$result;
if(is_null($scale))
{
return bcadd($start,$result);
}else
{
return bcadd($start,$result,$scale);
}
}
echo bc_rand('-34534345645635235346332454363453454564','235232389573642345273523451642',6);
|

09-06-2009, 14:11
|
|
OneWayUserAcci
Registrierter Benutzer
|
|
Registriert seit: Dec 2008
Beiträge: 16
|
|
Nun tritt wieder das Problem der Verteilung auf s.u.. Ich nehm mal an, dass im PHP C-Quelltext keine extra Funktion dafür gebaut wurde und einfach eine von C genommen wurde, daher die Begrenzung?! Und sowas wie Zend_Rand gibts glaub auch net, mal schauen, irgendwie kriegt man das schon zamm gewurschtelt.
PHP-Code:
Array
(
[10] => 5085
[7] => 532
[4] => 524
[0] => 505
[8] => 491
[3] => 485
[5] => 484
[9] => 481
[2] => 480
[1] => 472
[6] => 461
)
|

11-06-2009, 13:04
|
|
OneWayUserAcci
Registrierter Benutzer
|
|
Registriert seit: Dec 2008
Beiträge: 16
|
|
Ich hab mich für die folgende Funktion entschieden, welche ich gefunden habe.
PHP-Code:
function bcrand($min, $max)
{
if(bccomp($max, $min) != 1)
{
return 0;
}
$top = bcsub($max, $min);
$rand = bcadd($top, 1);
$length = strlen($top);
while(bccomp($rand, $top) == 1)
{
unset($rand_part);
$n = 0;
while(9 * $n <= $length)
{
if($length - 9 * $n >= 9)
{
$rand_part[] = mt_rand(0, 999999999);
}
else
{
$j = 0;
$foo = '';
while($j < $length - 9 * $n)
{
$foo .= '9';
++$j;
}
$foo += 0;
$rand_part[] = mt_rand(0, $foo);
}
++$n;
}
$i = 0;
$rand = '';
$count = count($rand_part);
while($i < $count)
{
$rand .= $rand_part[$i];
++$i;
}
}
return bcadd($rand, $min, 0);
}
Geändert von OneWayUserAcci (11-06-2009 um 13:10 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|