1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Cocoa uniq Zufallszahl

Dieses Thema im Forum "OS X-Developer" wurde erstellt von zorn, 19.07.07.

  1. zorn

    zorn Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    18.02.06
    Beiträge:
    251
    Hallo,

    brauche für mein Projekt Zufallszahlen. Z.B. ein Array mit den Zahlen 1-20, in zufälliger Reihenfolge, alle uniq. Mh...

    Habe hier im Forum diesen PHP-Code gefunden, geht bischen in die richtige Richtung:

    PHP:
    function zahlen() {
    srand();
    $slot = array();
    while(
    sizeof($slot) < 6) {
    $random rand(1,6);
    if(!
    in_array($random$slot)) $slot[] = $random;
    }
    }
    Die hier versteh' ich nicht: if(!in_array($random, $slot)) $slot[] = $random;


    Hat mir jemand Tips für den Code, bzw. einen weiterführenden Link? Finde per Google entweder nur hochwissenschaftliche Artikel die sich mit Zufallszahlen beschäftigen, oder eben nur sehr triviale. Kein wirkliches Cocoa-Tut. Gibt es vieleicht eine Klasse die mir genau meine Anforderungen erfüllt. z.B. arr = rand(1-20, uniq)
    Wär das nicht schön?
     
  2. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Gib mal im Terminal ein:
    Code:
    man random
    Da bekommst Du eine Beschreibung der Standard C Funktion random().

    MacApple
     
  3. Peter Maurer

    Peter Maurer Carmeliter-Renette

    Dabei seit:
    16.03.04
    Beiträge:
    3.274
    Das bedeutet nur, dass Zahlen, die schon in der Zahlenfolge sind und nochmal zufaellig gezogen werden, nicht nochmal verwendet werden.

    Wenn sie aber neu sind, d.h. noch nicht im $slot-Array enthalten, dann werden sie dem Array mittels ...

    $slot[] = $random;

    ... angefuegt. Das ist, sagen wir mal, halbelegant und kann bei groesseren Zahlenraeumen eine ganze Menge Zeit kosten. Aber bei 20 Stellen sollte es kein merkliches Problem sein.
     
  4. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Mein Standard Algorithmus ist der hier:
    Code:
    initialisiere das Array ZFS mit den zulässigen Werten, also ZFS[1..20]=(1..20)
    for (i=20; i>1; --i) {
       ermittle eine Zufallszahl j im Bereich 1..i
       tausche ZFS[i] mit ZFS[j]
    }
    
    Es läuft also im Prinzip so, daß Du aus einem "Kartenstapel" (ZFS) zufällig "Karten" ziehst und auf einen neuen Stapel legst. Dieser neue ist dann gemischt.
     
  5. zorn

    zorn Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    18.02.06
    Beiträge:
    251
    @Skeeve:

    ...kann es sein dass dein Code keine Prüfung macht ob die Zahl zwischen 1..20 schon im Array ist? Es kann also sein dass in deinem Kartenstapel 10 Asse und 8 Könige vorkommen?

    Wie bekomme ich das uniq elegant hin?
     
  6. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Kann es sein, daß Du gar nicht den Algorithmus verstanden hast?

    Was denkst Du ist die Bedeutung der ersten Zeile?
    Code:
    initialisiere das Array ZFS mit den zulässigen Werten, also ZFS[1..20]=(1..20)
    
     
  7. zorn

    zorn Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    18.02.06
    Beiträge:
    251
    Da muss ich zugeben dass ich den tatsächlich nicht verstanden habe. Könntest du bitte erläutern?
    Ist das Objective-C gültige Syntax?
    Hey - ich bin Cocoa Anfänger! Habe nur mit Proceduralen Sprachen Erfahrung, und meist haben sich meine Probleme bisher mit Shell-Script oder Perl gelöst...
     
  8. MatzeLoCal

    MatzeLoCal Rheinischer Bohnapfel

    Dabei seit:
    05.01.04
    Beiträge:
    2.421
    prozedural tut in dem beispiel aber garnichts zur Sache :p

    Skeeve's Code ist "Pseudocode"... also nicht compilierbar, dafür leicht lesbar
     
  9. zorn

    zorn Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    18.02.06
    Beiträge:
    251
    Schon klar - wollte nur unterstreichen dass mir Objective-C Syntax noch nicht wirklich geläufig ist. War für mich vorstellbar dass das eine Möglichkeit ist zu sagen - Hey - Array - du darfst Zahlen von 1-20 aufnehmen, aber jede nur einmal.

    Also - kennt jemand eine elegante Lösung oder muss ich nach jedem Random einen Abgleich gegen alle bisherigen Array-Inhalte machen?

    In dem Beispiel das ich oben gebracht habe: "if(!in_array($random, $slot)) $slot[] = $random;" - ist "!in_array" also auch pseudocode oder eine PHP-Funktion? Falls ja - gibbet sowas auch in Cocoa? Muss ich das selber bauen?

    Ihr setzt bei mir einfach zuviel vorraus 8)
     
  10. MatzeLoCal

    MatzeLoCal Rheinischer Bohnapfel

    Dabei seit:
    05.01.04
    Beiträge:
    2.421
    Das mag etz arrogant klingen, aber welchen Teil von Skeeve's Beispiel hast Du denn nicht verstanden?
     
  11. zorn

    zorn Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    18.02.06
    Beiträge:
    251
    die erste Zeile

    "initialisiere das Array ZFS mit den zulässigen Werten, also ZFS[1..20]=(1..20)"

    Wie sollen dadurch die Inhalte uniq werden? Versteh' ich nicht...
     
  12. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Oh Mein Gott!

    Viel Erfahrung mit prozeduralen Sprachen hast Du aber auch nicht!
    initialisiere das Array ZFS mit den zulässigen Werten, also ZFS[1..20]=(1..20)
    meint:
    Code:
    for (i=20; i>0; --i) { ZFS[i]=i; }
    Ich schreibe sowas nur ungerne, weil es in der, von mir präferierten Sprache so geschrieben wird:
    Code:
    my @zfs= (1..20)
    (wobei hier allerdings der Index bei 0 beginnt)
     
  13. MatzeLoCal

    MatzeLoCal Rheinischer Bohnapfel

    Dabei seit:
    05.01.04
    Beiträge:
    2.421
    Damit meint er, dass Du einen Array erstellen sollst, der von Beginn an mit den Werten die Du für gültig erklärst gefüllt ist.

    Beispielsweise sowas:
    Code:
    int zfs[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
     
  14. zorn

    zorn Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    18.02.06
    Beiträge:
    251
    Ahhhhh!

    Schon klar! 8)

    ABER: Wie soll dadurch das Ergebnis uniq werden? Vieleicht bin ich ja zu doof, aber meiner Ansicht nach kann hierbei das Ergebniss doch mehrfach 18 sein, oder?

    Das meinte ich mit meinem Beispiel mit 10 Assen und 8 Königen. Im ursprünglichen Array natürlich nicht, aber im Ergebniss dann doch schon, oder?

    Ich ziehe 20x eine Zufallszahl zwischen 1 und 20. Was an dem Code verhindert dass ich 10x die 3 ziehe?
     
  15. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Ich nehme es zurück. Du hast nicht "nicht viel" Erfahrung, ich postuliere: Du bist blutiger Anfänger!

    Wenn Du nochnichteinmal den Psudocode, geschweige denn meine natürlichsprachliche Erklärung dazu verstehst, dann rate ich Dir, Dir ein anderes Hobby zu suchen.

    Werde Schriftsteller, lern Häkeln oder Stricken, aber bitte, bitte, bitte versuche nicht weiter zu Programmieren...

    ;)
     
  16. zorn

    zorn Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    18.02.06
    Beiträge:
    251
    Kling!

    Endlich hab' ichs geblickt. Dachte du hast das hier vor:

    1. Durchlauf - Range 1..20 --> ermittelte Zufallszahl 10
    2. Durchlauf - Range 1..19 --> ermittlete Zufallszahl 10
    3. Durchlauf - Range 1..18 --> ermittlete Zufallszahl 10
    4. Durchlauf - Range 1..17 --> ermittlete Zufallszahl 10

    So hätt' ich natürlim am Ende im schlechtesten Fall ein Array mit ausschliesslich zehnern...

    Hab' grade auf ebay vorsorglich Stricknadeln und Wolle bestellt...

    Meine Güte bist du raffiniert! ;)
    Das ist genau was ich wollte und ich habs nicht kapiert. Autsch!

    Ich geh' mich dann mal kasteien...
     
    Skeeve gefällt das.
  17. Hobbes_

    Hobbes_ Gast

    Buchtipp:

    Das Thema der Zufallsgeneratoren ist nicht so trivial, wie man es sich vorstellen könnte. Eine der Fragen bzgl. Wahl des Algorithmus ist auch, wie zufällig die Zufallszahl überhaupt sein muss. Die Qualität der Zufallsgeneratoren ist nicht überall optimal - jedoch muss sie das auch nicht für jede Anwendung sein.

    Mehr zum Thema:
    Press, Teukolsky, Vetterling, Flannery: Numerical recipes in C++, The Art of Scientific Computing, Cambridge University Press.

    @Skeeve: Cooler Kartenmischer :)
     
  18. KayHH

    KayHH Gast

    Schöner Algorithmus! KayHH
     

Diese Seite empfehlen