php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-06-2009, 06:46
OneWayUserAcci
 Registrierter Benutzer
Links : Onlinestatus : OneWayUserAcci ist offline
Registriert seit: Dec 2008
Beiträge: 16
OneWayUserAcci ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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;
    }

Mit Zitat antworten
  #2 (permalink)  
Alt 09-06-2009, 09:55
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

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.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #3 (permalink)  
Alt 09-06-2009, 13:00
OneWayUserAcci
 Registrierter Benutzer
Links : Onlinestatus : OneWayUserAcci ist offline
Registriert seit: Dec 2008
Beiträge: 16
OneWayUserAcci ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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)
Mit Zitat antworten
  #4 (permalink)  
Alt 09-06-2009, 13:23
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von OneWayUserAcci Beitrag anzeigen
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(0pow(260));
// 1070457797516197888

echo mt_rand(0pow(260));
// 426054254793326592

echo mt_rand(0pow(260));
// 939119261509484544 
Mit Zitat antworten
  #5 (permalink)  
Alt 09-06-2009, 13:34
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

@h3ll
PHP: mt_getrandmax - Manual

Da hasste wohl ein 64 Bit System
Das hat aber nicht jeder.
PHP-Code:
echo mt_rand(0pow(260)).'<br>';
echo 
mt_rand(0pow(260)).'<br>';
echo 
mt_rand(0pow(260)).'<br>';
echo 
mt_rand(0pow(260)).'<br>';
echo 
mt_rand(0pow(260)).'<br>'
Liefert bei mir IMMER und konsequent 0. Nix anderes.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #6 (permalink)  
Alt 09-06-2009, 13:42
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von combie Beitrag anzeigen
@h3ll
PHP: mt_getrandmax - Manual

Da hasste wohl ein 64 Bit System
Das hat aber nicht jeder.
Tja, wer hat, der hat

64-Bit Prozessoren kriegt man inzwischen eh schon nachgeschmissen.
Mit Zitat antworten
  #7 (permalink)  
Alt 09-06-2009, 13:51
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

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(
=== 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); 
__________________
Wir werden alle sterben
Mit Zitat antworten
  #8 (permalink)  
Alt 09-06-2009, 14:11
OneWayUserAcci
 Registrierter Benutzer
Links : Onlinestatus : OneWayUserAcci ist offline
Registriert seit: Dec 2008
Beiträge: 16
OneWayUserAcci ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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

Mit Zitat antworten
  #9 (permalink)  
Alt 11-06-2009, 13:04
OneWayUserAcci
 Registrierter Benutzer
Links : Onlinestatus : OneWayUserAcci ist offline
Registriert seit: Dec 2008
Beiträge: 16
OneWayUserAcci ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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($top1);
    
$length strlen($top);
    while(
bccomp($rand$top) == 1)
    {
        unset(
$rand_part);
        
$n 0;
        while(
$n <= $length)
        {
            if(
$length $n >= 9)
            {
                
$rand_part[] = mt_rand(0999999999);
            }
            else
            {
                
$j 0;
                
$foo '';
                while(
$j $length $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$min0);


Geändert von OneWayUserAcci (11-06-2009 um 13:10 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zufallszahlen Benji PHP Developer Forum 6 16-11-2005 11:54
Zufallszahlen Elelady SQL / Datenbanken 13 10-08-2004 12:53
PHP? Zufallszahlen? AbRi§§BiRnE PHP Developer Forum 35 05-05-2004 22:41
Zufallszahlen in PHP??? gizzzmo PHP Developer Forum 2 29-03-2002 14:51
Zufallszahlen Berni PHP Developer Forum 1 24-10-2000 07:29

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:36 Uhr.