kostenloser Webspace werbefrei: lima-city


3 Zufallszahlen, die zusammen ein Ergebnis geben sollen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    safeyourface

    Kostenloser Webspace von safeyourface, auf Homepage erstellen warten

    safeyourface hat kostenlosen Webspace.

    Hallo...

    Ich möchte 3 Zufallszahlen zwischen 0 und 50 nebeneinander stehen haben. Diese 3 Zahlen müssen zusammen addiert genau 50 ergeben. Wie mache ich das??

    Beispiel:

    0 | 50 | 0
    10 | 25 | 15
    41 | 3 | 6
    ...

    Kann mir jemand helfen?
    Gruß
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. g****e

    Du könntest eine Matrix erstellen, die alle möglichen Kombinationen enthält, und dann hierraus ein zufälliges Ergebnis entnehmen.
    Also:

    $matrix = array();
    
    for ( $i0 = 0; $i0 <= 50 ; $i0++ ) {
        for ($i1 = 0; $i1 <= (50 - $i0) ; $i1++) {
            $matrix[] = array( $i0 , $i1 , 50-$i0-$i1);
        }
    }
    
    $randEintrag = rand( 0 , count( $matrix ) -1 );
    
    var_dump( $matrix[ $randEintrag ] );


    Ungetestet, aber sollte den Job erledigen. Das Array kannst du auch Cachen, sorgt für bessere Performance.

    Liebe Grüße

    Beitrag zuletzt geändert: 4.5.2012 13:31:24 von ggamee
  4. Autor dieses Themas

    safeyourface

    Kostenloser Webspace von safeyourface, auf Homepage erstellen warten

    safeyourface hat kostenlosen Webspace.

    Ich habe deinen Code einfach mal so übernommen und in mein Script gepackt.
    Ausgegeben wird folgendes:

    array(3) { [0]=> int(0) [1]=> int(31) [2]=> int(19) }


    Ich sehe die Zahlen 0, 31 und 19. Das sieht ja schonmal gut aus. Aber wie gebe ich das jetzt richtig aus?

    Danke schonmal für deine Antwort!



    Beitrag zuletzt geändert: 4.5.2012 11:04:25 von safeyourface
  5. g****e

    Du kannst nun ganz normal auf die Zeilen zugreifen. Das ganze ist nun ein 2 Stufe Array. Du kannst also schreiben:
    $randEintrag = rand( 0 , count( $matrix ) -1 );
    
    echo $matrix[ $randEintrag ][0] .' + '. $matrix[ $randEintrag ][1] .' + '. $matrix[ $randEintrag ][2] .' = 50';


    Du kannst somit ganz normal auf die Member zugreifen. Einfacher könnte es für dich werden, wenn du das Array vllt seperierst:

    $randEintrag = rand( 0 , count( $matrix ) -1 );
    $randZeile = $matrix[ $randEintrag ];
    
    echo $randZeile[0] . '<br/>';
    echo $randZeile[1] . '<br/>';
    echo $randZeile[2] . '<br/>';
    echo ' = 50';


    Liebe Grüße
  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Matrix? Wozu? (WTF?!)

    Nimm einfach folgenden Code:
    $sum = 50;
    $first = rand(0, $sum);
    $range2 = $sum - $first;
    $second = rand(0, $range2);
    $third = $sum - $first - $second;
    
    echo("$first|$second|$third");
    Und vergiss die verdammte vertrottelte Matrix, das braucht nur Rechenleistung und Speicherplatz und sonst gar nichts!

    Fangt doch mal an logisch zu überlegen...
  7. hackyourlife schrieb:
    Matrix? Wozu? (WTF?!)

    Nimm einfach folgenden Code:
    $sum = 50;
    $first = rand(0, $sum);
    $range2 = $sum - $first;
    $second = rand(0, $range2);
    $third = $sum - $first - $second;
    
    echo("$first|$second|$third");
    Und vergiss die verdammte vertrottelte Matrix, das braucht nur Rechenleistung und Speicherplatz und sonst gar nichts!

    Fangt doch mal an logisch zu überlegen...


    und dann könntest noch zur Überprüfung des Anhängen

    $summefromrand= $first + $second + $third;
    if ( $summefromrand == 50)
    {
    echo 'Summe ist 50!";
    }
    else
    {
    echo 'Es gab einen Fehler!';
    }
  8. <?php
    $sum = 50;
    $durchgaenge = 3;
    
    $i = 0;
    $matrix = array();
    
    while(array_sum($matrix) <> $sum) {
        $matrix[$i] = mt_rand(1, $sum/mt_rand(1,5));
    
        if($i++ == $durchgaenge-1) {
            $i = 0;
        }
    }
    
    echo implode($matrix, ' | ');


    @hackyourlife

    Die Matrix hat den Vorteil, dass du nicht für jede Zahl eine Variable definieren musst. Denn das könnte nervig werden, wenn man das Selbe z.B. mit 20 Zahlen umsetzen möchte ;)

    Beitrag zuletzt geändert: 4.5.2012 14:18:46 von fabo
  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    fabo schrieb:
    Die Matrix hat den Vorteil, dass du nicht für jede Zahl eine Variable definieren musst. Denn das könnte nervig werden, wenn man das Selbe z.B. mit 20 Zahlen umsetzen möchte ;)
    Selbst dann verwendest du keine Matrix so wie das hier gezeigt wurde... du speicherst die Werte dann einfach nicht in 20 Variablen sondern in ein Array ;-)

    Wenn es erwünscht ist kann ich den Code dazu posten.
  10. Naja... Lösungsvorschläge gab's ja nun genug :D
  11. g****e

    Des war ja auch nur mein erster Gedanke heut morgen im Halbschlaf. Wie man es letztendlich macht ists ja egal. Wenn man die Einträge Cached kann man sie entsprechend an anderem Ort wieder einsetzen, wer weiß, wozu sie gebraucht werden. Ich glaube heute morgen war ich noch der Meinung, dass man rand nur einmal nutzen darf, weil die Werte sonst zu gleich sind, aber das is in PHP nich direkt der Fall.

    Hauptsache es ist eine mögliche Lösung, und bis zum Nachmittag habt ihr das ja schon verbessert :-D

    Liebe Grüße
  12. Autor dieses Themas

    safeyourface

    Kostenloser Webspace von safeyourface, auf Homepage erstellen warten

    safeyourface hat kostenlosen Webspace.

    Also ich komme mit der Matrix gut zurecht! Danke an alle!
  13. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    safeyourface schrieb:
    Also ich komme mit der Matrix gut zurecht!
    Dir ist hoffentlich klar, dass du damit unnötig viel Rechenleistung verbrätst, speziell dann, wenn du dich mal dazu entscheiden solltest auch höhere Zahlen als 50 zu erlauben...
  14. hackyourlife schrieb:
    safeyourface schrieb:
    Also ich komme mit der Matrix gut zurecht!
    Dir ist hoffentlich klar, dass du damit unnötig viel Rechenleistung verbrätst, speziell dann, wenn du dich mal dazu entscheiden solltest auch höhere Zahlen als 50 zu erlauben...


    Also ich komme auf rund 50 MB, wenn ich das Ganze mit der Zahl 1000000 bei 1337 Durchläufen starte. Ich wage ehrlich gesagt auch zu bezweifeln, dass deine Lösung signifikant schneller/ressourcenschonender ist.
  15. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    fabo schrieb:
    Also ich komme auf rund 50 MB, wenn ich das Ganze mit der Zahl 1000000 bei 1337 Durchläufen starte.
    Was für die paar Zufallszahlen extrem viel ist...

    fabo schrieb:
    Ich wage ehrlich gesagt auch zu bezweifeln, dass deine Lösung signifikant schneller/ressourcenschonender ist.
    Dann vergleich doch mal selbst mit folgendem Code:
    <?php
    
    header('Content-Type: text/plain');
    
    $memory = memory_get_usage() / 1024;
    echo("initial: $memory KiB\n");
    
    $result = array();
    
    $sum = 1000000;
    $count = 1337;
    
    for($i = 0; $i < $count; $i++) {
    	$first = rand(0, $sum);
    	$range2 = $sum - $first;
    	$second = rand(0, $range2);
    	$third = $sum - $first - $second;
    	$result[] = array($first, $second, $third);
    }
    
    $memory = memory_get_usage() / 1024;
    
    echo("final: $memory KiB");
    
    ?>
    Dabei kommt folgende Ausgabe:
    initial: 310.5859375 KiB
    final: 852 KiB
    Und jetzt sag nochmal, dass meine Variante nicht signifikant weniger resourcen braucht ;-)

    Die Laufzeit habe ich dir jetzt nicht messen können, weil ich die Laufzeit von deinem Script nicht kenne...
  16. Vergiss die Aussage mit den 50 MB, hab was falsches gemessen ;)

    Aber ich habe mal beide Scripts getestet (deine & meine)

    Deine:

    initial: 618.0546875 KiB
    final: 1983.4921875 KiB
    time: 0.0057859420776367

    Meine:

    initial: 616.734375 KiB
    final: 618.1796875 KiB
    time: 3.5087280273438

    Ergebnis:

    Du hast Recht, auch wenn ich jetzt etwas verwundert bin. Aber definitiv nicht schlecht, hab ich wieder etwas gelernt :)

    EDIT:

    So geht's etwas schneller:

    <?php
    $sum = 1000000;
    $durchgaenge = 1337;
    
    $i = 0;
    $matrix = array();
    
    while(array_sum($matrix) <> $sum) {
        $matrix[$i] = mt_rand(1, $sum);
    }



    Beitrag zuletzt geändert: 4.5.2012 21:38:10 von fabo
  17. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    fabo schrieb:
    Aber ich habe mal beide Scripts getestet (deine & meine)

    Deine:

    initial: 618.0546875 KiB
    final: 1983.4921875 KiB
    time: 0.0057859420776367

    Meine:

    initial: 616.734375 KiB
    final: 618.1796875 KiB
    time: 3.5087280273438

    Ergebnis:

    Du hast Recht, auch wenn ich jetzt etwas verwundert bin. Aber definitiv nicht schlecht, hab ich wieder etwas gelernt :)
    Poste bitte deinen Code den du getestet hast, ich weiß irgendwie nicht was du gemessen hast...

    fabo schrieb:
    So geht's etwas schneller:

    <?php
    $sum = 1000000;
    $durchgaenge = 1337;
    
    $i = 0;
    $matrix = array();
    
    while(array_sum($matrix) <> $sum) {
        $matrix[$i] = mt_rand(1, $sum);
    }

    Macht das auch das was gefragt ist? Es sollen ja 3 Zufallszahlen erstellt werden, die zusammen 50 ergeben...
    Das passiert bei deinem Code irgendwie nicht...
    Der Code soll auch die Anforderung erfüllen ;-) (schnell sein alleine reicht nicht :biggrin:)
  18. <?php
    header('Content-Type: text/plain');
    
    $start = microtime(true);
    $memory = memory_get_usage() / 1024;
    echo("\ninitial: $memory KiB\n");
    
    $sum = 1000000;
    $durchgaenge = 1337;
    
    $i = 0;
    $matrix = array();
    
    while(array_sum($matrix) <> $sum) {
        $matrix[$i] = mt_rand(1, $sum/mt_rand(1,5));
    }
    
    $memory = memory_get_usage() / 1024;
    $end = microtime(true)-$start;
    
    echo("final: $memory KiB\ntime: $end\n\n");
  19. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    fabo schrieb:
    <?php
    header('Content-Type: text/plain');
    
    $start = microtime(true);
    $memory = memory_get_usage() / 1024;
    echo("\ninitial: $memory KiB\n");
    
    $sum = 1000000;
    $durchgaenge = 1337;
    
    $i = 0;
    $matrix = array();
    
    while(array_sum($matrix) <> $sum) {
        $matrix[$i] = mt_rand(1, $sum/mt_rand(1,5));
    }
    
    $memory = memory_get_usage() / 1024;
    $end = microtime(true)-$start;
    
    echo("final: $memory KiB\ntime: $end\n\n");
    Das ist zwar nett gemeint, der Code macht aber nicht das was gefragt ist: es sollen 3 Zahlen im Bereich von 0-50 gesucht werden die zusammen 50 ergeben (auch wenn das bei dir $sum ist, das wäre ja noch verkraftbar).
    Dein Code sucht aber so lange nach einer Zufallszahl bis die Zufallszahl genau $sum ist, weil $i nicht inkrementiert wird...
    Genau 3 Zahlen kann dein Code sowieso nicht erzeugen, weil der so lange suchen würde bis er genau $sum hat, was manchmal auch unmöglich sein könnte (wenn $i richtig weitergezählt werden würde)...
  20. War auch BS... Das hier war, was ich getestet habe:

    <?php
    header('Content-Type: text/plain');
    
    $start = microtime(true);
    $memory = memory_get_usage() / 1024;
    echo("\ninitial: $memory KiB\n");
    
    $sum = 1000000;
    $durchgaenge = 1337;
    
    $i = 0;
    $matrix = array();
    
    while(array_sum($matrix) <> $sum) {
        $matrix[$i] = mt_rand(1, $sum);
    
        if($i++ == $durchgaenge-1) {
    		$i = 0;
        }
    }
    
    $memory = memory_get_usage() / 1024;
    $end = microtime(true)-$start;
    
    echo("final: $memory KiB\ntime: $end\n\n");


    Aber was du ansprichst, ist genau das Problem: Es kann passieren, dass $sum nie erreicht wird. Das dürfte sich aber lösen lassen und wohlmöglich die Ausführungszeit drastisch und relativ konstant senken, was wiederum einen Performancevorteil gegenüber deiner Version zur Folge hätte, da es grundsätzlich ressourcentechnisch günstiger ist (zumindest wenn man dem Ergebnis glauben darf).

    Die letzte Zahl kann logischerweise so oder so nicht zufällig sein, weshalb es ja reichen sollte, einen Schritt vor Ende der Schleife die bereits bestehende Matrix (oder was auch immer) um die Differenz der bisherigen Summe und $sum zu erweitern. So MUSS es immer ein (richtiges) Ergebnis geben.

    Oder vertu ich mich da gerade?!

    EDIT:

    Hab leider grad keine Zeit, das zu testen, aber hier mal ein Vorschlag zur Güte:

    <?php
    header('Content-Type: text/plain');
    
    $start = microtime(true);
    $memory = memory_get_usage() / 1024;
    echo("\ninitial: $memory KiB\n");
    
    $sum = 1000000;
    $durchgaenge = 1337;
    
    $i = 0;
    $matrix = array();
    
    while(array_sum($matrix) < $sum) {
        $cur = array_sum($matrix);
    
        if($i++ == $durchgaenge-1) {
            $matrix[$i] = ($cur < $sum) ? ($sum - $cur) : 0;
            $i = 0;
        }
        else {
            $matrix[$i] = mt_rand(0, $sum/mt_rand(1,5));
        }
    }
    
    $memory = memory_get_usage() / 1024;
    $end = microtime(true)-$start;
    
    echo("final: $memory KiB\ntime: $end\n\n");


    EDIT:

    Okay... Funktioniert auch nicht 100%ig... Belassen wir es dabei, dass ich zumindest der Ansicht bin, dass wenn man es entsprechend korrekt aufbaut, die z.B. von mir gepostete Lösung sowohl schneller, als auch ressourcenschonender ist. Fakt ist jedoch, dass deine Lösung zumindest funktioniert und auch nicht gerade viele Ressourcen beansprucht.

    Beitrag zuletzt geändert: 4.5.2012 23:17:37 von fabo
  21. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    fabo schrieb:
    Belassen wir es dabei, dass ich zumindest der Ansicht bin, dass wenn man es entsprechend korrekt aufbaut, die z.B. von mir gepostete Lösung sowohl schneller, als auch ressourcenschonender ist. Fakt ist jedoch, dass deine Lösung zumindest funktioniert und auch nicht gerade viele Ressourcen beansprucht.
    Der wichtige Unterschied ist immer noch was die beiden Varianten machen...
    Deine berechnet offensichtlich $durchgaenge viele Zufallszahlen, die gemeinsam $sum ergeben (sollten).
    Meine Variante hingegen berechnet $count mal 3 Zufallszahlen die zusammen $sum ergeben, es kommen also 3*$count Zufallszahlen heraus...

    Und somit machen beide Varianten etwas unterschiedliches, was auf einem Missverständnis beruhen könnte... vergleichen lässt sich das so jedenfalls nicht.
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!