ebiz-webhosting
- Ad -
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! Post your PHP questions here!

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: 2.925
combie befindet sich auf einem aufstrebenden Ast
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: 2.328
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: 2.925
combie befindet sich auf einem aufstrebenden Ast
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: 2.328
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: 2.925
combie befindet sich auf einem aufstrebenden Ast
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

MariaDB 5.5 veröffentlicht
MariaDB 5.5 veröffentlichtDie freie MySQL-Alternative MariaDB wurde in der stabilen Version 5.5.23 veröffentlicht und soll einige Verbesserungen gegenüber Oracles Communityversion von MySQL mitbringen.

16.04.2012 | Berni

Deutsche Yii Framework Community
Deutsche Yii Framework CommunitySeit dem 19.03.2012 gibt es für die Yii PHP Framework Community ein deutsches Zuhause.

20.03.2012 | dhcomputer

 

Aktuelle PHP Scripte

EM 2012 Tipp-Spiel ansehen EM 2012 Tipp-Spiel

Online Tipp-Spiel zur Fussball Europameisterschaft 2012, basierend auf php-Script mit hinterlegter mySql-Datenbank

27.05.2012 tippimnetz | Kategorie: PHP/ Spiele
Advanced Login ansehen Advanced Login

Login-System und Kundenverwaltung, die sich spielend leicht in bestehende Webseiten einbauen lässt und einen enormen Funktionsumfang bietet. Ihre eigene Webseite muss mit Advanced Login nicht umständlich an ein fertiges System angepasst werden.

25.05.2012 Madden | Kategorie: PHP/ Kundenverwaltung
BROM CMS/BelCal 3 ansehen BROM CMS/BelCal 3

Spezielles CMS für Betreiber von Ferienwohnungen. Komplette Seitenerstellung online, Verwaltung mehrerer Objekte, Reservierungssystem mit sofortigem Abgleich im Belegungskalender und vieles mehr bietet dieses Content Management System.

25.05.2012 belcal2 | Kategorie: PHP/ CMS
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:48 Uhr.