php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.07.2008, 07:03  
Neuer Benutzer
 
Registriert seit: 25.07.2008
Beiträge: 17
Autoterrorist befindet sich auf einem aufstrebenden Ast
Standard Zahl splitten und aufteilen

Ich habe 3 Werte, die ich aus einer DB auslese

wert1 = 100
wert2 = 30
wert3 = 100

Und ich habe einen Wert, der noch eine Zahl enthält:

$zahl = 170

Nun möchte ich die Zahl in drei zufällig große Teile splitten (z.B. 90, 30, 50) und den drei Werten zuordnen - mit der Bedingung, dass der zugeteilte Wert nicht größer als der Wert ist (wert1 dürfte also nichts über 100 zugeteilt werden). Die $zahl soll komplett aufgebraucht werden, also am Ende 0 ergeben.

Ich schaffe es zwar den drei Werten eine zufällige Zahl zuzuordnen, aber leider bleibt immer ein Rest bei $zahl übrig.

PHP-Code:
$zahl 170;

while(
$wert mysql_fetch_array($ergebnis)) // Schleife wird 3x wiederholt
{
$zufall         rand(0,$wert['x']);   // Zufallszahl: min:0 / max:wert
if($zufall $zahl]) 

$wert['x']  = $zufall;                  // Wert wird mit der Zufallszahl überschrieben
$zahl           $zahl $zufall;          // Zufallszahl wird von $zahl abgezogen
}

Autoterrorist ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 30.07.2008, 07:24  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Wie wärs wenn du in die letzte Zeile deines Codes da eindach $wert['x'] = $wert['x'] + $zahl; schreibst?
cycap ist offline  
Alt 30.07.2008, 08:49  
Erfahrener Benutzer
 
Registriert seit: 07.12.2007
Beiträge: 103
PHP-Kenntnisse:
Fortgeschritten
Varon befindet sich auf einem aufstrebenden Ast
Standard

Du hast schon den falschen Ansatz.

Wenn ich das richtig verstanden habe ist das erste Ziel deines Programmes die Zahl ($zahl) Komplett auf zubrauchen.

Sprich du musst eine Schleife schreiben die solange läuft wie $zahl > 0 ist.
__________________
Ich mag Schildkröten!
Varon ist offline  
Alt 30.07.2008, 09:45  
Neuer Benutzer
 
Registriert seit: 25.07.2008
Beiträge: 17
Autoterrorist befindet sich auf einem aufstrebenden Ast
Standard

@cycap deinen Vorschlag verstehe ich nicht. Was soll das bewirken?

@Varon ich habe es anders gelöst:

PHP-Code:
while($einheit mysql_fetch_array($ergebnis)) 
{
$zufall            rand(10,30)/100;
$goback            $wert['x'] - ($wert['x']*$zufall); // wie viel der Wert bekommt
$rest              $zahl $goback;                                 // Rest der gesamten Zahl, die aufgeteilt werden kann
$dazu              $goback $wert['x'];                      // Differenz zwischen altem und neuem Wert, wird zur Gesamtzahl dazu addiert
if($rest 0) {
$zahl            $zahl $goback $dazu;
$wert['x'] = $goback;
}
else {
$wert['x'] = $zahl;
}

Ich packe die ersten Werte einfach voll (abzüglich 10-30%) und wenn der letzte Wert nicht mehr vollgepackt werden kann, bekommt er einfach den Rest der $zahl. Es kann passieren, dass dann einige Werte ganz leer bleiben, aber das stört mich hier nicht. Wer bessere Vorschläge posten möchte, soll dies tun. Danke für die Hilfe.
Autoterrorist ist offline  
Alt 30.07.2008, 09:50  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Zitat:
Zitat von Autoterrorist Beitrag anzeigen
@cycap deinen Vorschlag verstehe ich nicht. Was soll das bewirken?

Na das du das was übrig bleibst einfach in die dritte Variable mit reinpackst...
cycap ist offline  
Alt 30.07.2008, 09:55  
Erfahrener Benutzer
 
Registriert seit: 07.12.2007
Beiträge: 103
PHP-Kenntnisse:
Fortgeschritten
Varon befindet sich auf einem aufstrebenden Ast
Standard

Besser ist immer relativ. Es hängt ja auch davon ab was du erreichen möchtest.

Nach deiner ersten Beschreibung hätte ich es so gemacht:

PHP-Code:
$arr_BasisWerte = array();
    
$arr_NewWerte    = array();
    
    
$arr_BasisWerte[]['x'] = 100;
    
$arr_BasisWerte[]['x'] = 30;
    
$arr_BasisWerte[]['x'] = 100;
    
    
$arr_NewWerte $arr_BasisWerte;
    
$int_ZuVerteileneZahl 170;
    
    while(
$int_ZuVerteileneZahl 0)
    {
        foreach(
$arr_BasisWerte as $mix_key => $arr_Werte)
        {
            if(!isset(
$arr_NewWerte[$mix_key]))
                
$arr_NewWerte[$mix_key] = 0;
            
            
$int_MaxRand = ($arr_Werte['x'] < $int_ZuVerteileneZahl $arr_Werte['x'] : $int_ZuVerteileneZahl);
            
$int_AddToWert rand(0,$int_MaxRand);
            
            
$arr_NewWerte[$mix_key]['x'] += $int_AddToWert;
            
$int_ZuVerteileneZahl        -= $int_AddToWert;
            
            
//debug
            
echo 'Key: '.$mix_key.' - Value: '.$arr_NewWerte[$mix_key]['x'].'<br>';
            echo 
'Rest '.$int_ZuVerteileneZahl.'<hr>';
            
            if(
$int_ZuVerteileneZahl == 0)
                break;
        }
    }
    
    
print_r($arr_NewWerte); 
__________________
Ich mag Schildkröten!
Varon ist offline  
Alt 30.07.2008, 19:18  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Erstmal solltest Du ausrechnen, ob die Summe von $wert1 + $wert2 + $wert3 kleiner $zahl ist. Dann ist das Problem nicht lösbar. Da ich mir keinen sinnvollen Anwendungsfall vorstellen kann, erschließt sich mir auch nicht die angestrebte Zufälligkeit. Mein erster Ansatz wäre deswegen (Pseudocode):
PHP-Code:
if ($wert1 $wert2 $wert3 $zahl) break;
if (
$wert1 $zahl
  { 
$random1 $wert1 $zahl-= $wert1 }
else break;
// analog $wert2 und $wert3 
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 30.07.2008, 20:08  
Erfahrener Benutzer
 
Registriert seit: 26.07.2006
Beiträge: 121
JumperII
Standard

Hallo,

Selbst dieser ist nicht ausreichend, nikosch, da du anschließend immer wieder testen musst, ob es klappt. Bei einer ungünstigen Zahlenverteilung kommt man auch in Probleme:

a1 = 30
a2 = 50
a3 = 70

w = 120

a1 + a2 + a3 > w

a1 < w
r1 = 5
w(t1) = w - r1 = 115

a2 < w(t1)
r2 = 10
w(t2) = w(t1) -r2 = 105

a3 <w(t2) // So war wohl die Analogie gemeint?
==> Deadlock


Gruß,
Jumper, the II.
JumperII ist offline  
Alt 30.07.2008, 20:33  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Nein, ich habe Blödsinn geschrieben. Gemeint war das:
PHP-Code:
if ($wert1 $wert2 $wert3 $zahl) break;
if (
$wert1 $zahl
  { 
$random1 $wert1 $zahl-= $wert1 }
else 
  { 
$random1 $zahl $zahl }
// analog $wert2 und $wert3 
Bsp.
Code:
w1=30; w2=50; w3=70
z  = 120
30+50+70 < 120: FALSE
30 < 120: TRUE: r1=30;z=120-30 // r1 = 30
50 < 90: TRUE: r2=50;z=90-50 // r2 = 50
70 < 40: FALSE: r3=40 // r3 = 40
Im Endeffekt wird nur die letzte Komponente dynamisch.
Deine Syntax verstehe ich ehrlich gesagt nicht
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (30.07.2008 um 20:44 Uhr).
nikosch ist gerade online  
Alt 30.07.2008, 21:27  
Erfahrener Benutzer
 
Registriert seit: 26.07.2006
Beiträge: 121
JumperII
Standard

Hallo,

jetzt habe ich zumindest Deinen Ansatz verstanden Der macht aber wahrscheinlich keinen Sinn, wenn man auf diese Weise Testreihen aufbauen will

Ich hab mir mal erlaubt, eine Funktion zur gleichmäßigen Verteilung aufzubauen ... als Spielwiese:
PHP-Code:
function rand_V1$werte$ziel) {

  
$zahlen = array();


  do {

    
$zahlen[0] = $werte[0];

  
    
$summe 0;
    for( 
$l00 1$l00 <= $werte[0]; $l00++) {
      
$summe += $werte[$l00];
    }

    if( 
$summe $Ziel) {
      
$zahlen[0]=0;
      
$zahlen[1]="Keine Lösung möglich, da die Summe der Werte geringer als der Zielwert!";
      break;
    }

    for( 
$l00 1$l00 <= $werte[0]; $l00++) {
      
$zahlen[$l00] = $werte[$l00];
    }

    
$diff $summe $ziel;
    
$recalc true;
    
$rand_sum $summe;
    
$rand_con $werte[0];

    while( 
$diff 0) {
  
      if( 
$recalc) {
        
$rand_sum 0;
        
$rand_con 0;
        for( 
$l00 1$l00 <= $werte[0]; $l00++) {
          if( 
$zahlen[$l00] > 0) {
            
$rand_sum += $werte[$l00];
            
$rand_con += 1;
          }
        }
 
        
$recalc false;
      }

      if( 
$rand_con == 0) {
        
$zahlen[0]=-3;
        
$zahlen[1]="Nicht erreichbarer Zustand";
        break;
      }
      if( 
$rand_con == 1) {
        for( 
$l00 1$l00 <= $werte[0]; $l00++) {
          if( 
$zahlen[$l00] > 0) {
            
$zahlen[$l00] -= $diff;
            
$diff 0;
            
$recalc true;
            break;
          }
        }
        if( 
diff == 0) {
          break;
        }
        
$zahlen[0]=-2;
        
$zahlen[1]="Nicht erreichbarer Zustand";
        break;
      }

      
$rand mt_rand0$rand_sum -1);
      for( 
$l00 1$l00 <= $werte[0]; $l00++) {
        if( 
$zahlen[$l00] > 0) {
          if( 
$rand $werte[$l00]) {
            
$diff -= 1;
            
$zahlen[$l00] -= 1;
            if( 
$zahlen[$l00] == 0) {
              
$recalc true;
            }
            
$rand = -1;
            break;
          }
          
$rand -= $werte[$l00];
        }
      }
      if( 
$rand != -1) {
        
$zahlen[0]=-1;
        
$zahlen[1]="Nicht erreichbarer Zustand";
        break;
      }
    }

  } while( 
false);

  return( 
$zahlen);

wird in etwa so aufgerufen:
PHP-Code:
$werte[0] = 3;
$werte[1] = 100;
$werte[2] = 30;
$werte[3] = 100;

$zielwert 170;

for( 
$l00 1$l00 <= $werte[0]; $l00++) {
  print( 
"<tt>Wert" $l00 "=" $werte[$l00] . "</tt><br>\n");
}
print( 
"<tt>Zielwert=" $zielwert ."</tt><br><br>\n");
$zielwerte rand_V1$werte$zielwert);

if( 
$zielwerte[0] <= 0) {
  print( 
"<tt>Fehler " $zielwerte[0] . ":" $zielwerte[1] . "</tt><br>\n");
}
else {
  for( 
$l00 1$l00 <= $zielwerte[0]; $l00++) {
    print( 
"<tt>ziel" $l00 "=" $zielwerte[$l00] . "</tt><br>\n");
  }

Die Funktion setzt auf eine anteilig prozentuale Verteilung abzuziehender Wert im Einzelschritt. Man kann hier also sich richtig austoben.

Gruß,
Jumper, the II.
JumperII ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
zahlen mit zeilenumbruch nach x-ter zahl ausgeben centauro PHP Tipps 2008 2 09.02.2008 14:22
Zahl aufteilen in Vor- und Nachkomma nicobischof PHP Tipps 2008 2 10.01.2008 15:32
Zahl 5 in Zahl 005 umwandeln? DDogg PHP Tipps 2006 11 18.05.2006 17:11
preg_replace: Zahl anstatt String FI-DD PHP-Fortgeschrittene 4 02.10.2005 14:50
Feststellen wie viele Ziffern eine Zahl vor dem Komma hat Wimme PHP Tipps 2005-2 2 01.10.2005 14:10
Zeichenkette splitten und mit ihnen rechnen PHP Tipps 2005-2 6 08.07.2005 12:44
zahl ausgeben wenn gerade Tschuu PHP Tipps 2005-2 6 07.07.2005 19:20
per Update eine zahl ehöhen lassen Datenbanken 3 04.07.2005 16:37
Prüfung auf Zahl, Wert in PHP? PHP Tipps 2005-2 1 07.06.2005 10:32
Größte Zahl raussuchen themonk PHP Tipps 2005 3 21.04.2005 19:27
$zahl in eine echte Zahl im Script?!? Matthiasnet PHP Tipps 2005 3 07.03.2005 22:17
Zahl in "Blöcke" aufteilen PHP Tipps 2005 2 02.03.2005 10:33
zahl von fremder seite herausfiltern! PHP Tipps 2004-2 3 12.11.2004 15:12
Zahl aus txt-datei auslesen... PHP Tipps 2004 6 23.07.2004 13:37
Zahl aus Textstring rausziehen PHP Tipps 2004 2 11.07.2004 14:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php zahlen splitten, zahl zufällig aufteilen, http://www.php.de/php-einsteiger/46384-zahl-splitten-und-aufteilen.html, excel wert zufall stückeln, javascript zahl splitten, php string gleichmäßig teilen und addieren, php inhalt eines array gleichmäßig in blöcken aufteilen und ausgeben, eine zahl splitten php, php nummernzuteilung, php split array gleichmäßig, excel prozentuale verteilung zufall, javascript zahl auf ziffer aufteilen, excel texte und zahlenaufteilen, javascript zahlen splitten, wie kann man eine zahl bei javascript aufteilen, einen wert in excel anteilig verteilen, zahl zufällig zerteilen, zahl splitten, zahl prozentual aufteilen php, php zahl zufällig aufteilen

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




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum