arc4random Aufeinanderfolgende

  • arc4random Aufeinanderfolgende

    Hallo,


    ich brauche einen Zufallsgenerator. Dafür habe ich

    Quellcode

    1. r = (arc4random()%5)+0;
    benutzt. Damit funktioniert alles sehr gut, nur eins stört mich. Ist es möglich, dass nicht die gleiche Zahl zweimal direkt aufeinander folgt?


    Vielen Dank schonmal
  • Alternativ zum Wiederholen kannst Du auch eine positive Zufallszahl auf die letzte draufaddieren, in etwa so:

    Quellcode

    1. static int rLast = -1; //negativ = start
    2. r = (rLast < 0) ? ((arc4random()%5)+0) : ((rLast + 1 + (arc4random()%4)) % 5);
    3. rLast = r;

    Das vermeidet die (beliebig lange) Schleife.
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    Alternativ zum Wiederholen kannst Du auch eine positive Zufallszahl auf die letzte draufaddieren, in etwa so:

    Quellcode

    1. static int rLast = -1; //negativ = start
    2. r = (rLast < 0) ? ((arc4random()%5)+0) : ((rLast + 1 + (arc4random()%4)) % 5);
    3. rLast = r;

    Das vermeidet die (beliebig lange) Schleife.


    hm? wenn du zuerst 3 oder 4 bekommst, kannst du aber nie mehr 0, 1 oder 2 bekommen!?

    edit: sorry, das zweite %5 übershen ;)
  • Den Fragezeichen-Operator finde ich persönlich ja immer etwas gruselig… wenn man den nicht mag, sollte es auch so gehen:

    Quellcode

    1. const int kMaxValue = 5;
    2. static int rLast = arc4random() % kMaxValue;
    3. r = (rLast + 1 + (arc4random() % (kMaxValue - 1)) % kMaxValue;
    4. rLast = r;

    Gerade bei so kleiner Auswahl von fünf Möglichkeiten ist es aber absolut normal, dass es Wiederholungen gibt - ich bin ziemlich sicher, dass mir schnell auffallen würde, wenn ein Generator so manipuliert ist…
    Ich weiss nicht, warum dich Dubletten stören, aber wenn du einfach nur eine Folge von Zahlen brauchst, die möglichst zufällig erscheint (richtig zufällig ist das ja alles eh nicht - richtige Zufallszahlen sind teuer ;-), macht es keinen Sinn, auffällige Muster rauszufiltern (0, 1, 2, 3, 4 ist genau so wahrscheinlich wie 1,1,1,1,1 oder 4,1,3,1,4 oder jede beliebige andere Folge).
  • Fragezeichen sind super! Aber Dein Code ist tatsächlich sauberer.

    Du hast Recht, dass das Wiederholungen bei Zufallszahlenreihen normal sind. Aber andererseits ist es auch ohne direkte Wiederholungen eine Zufallsreihe, nur halt kein weißes Rauschen. Es gibt viele Anwendungen, für die das nützlich sein kann - man weiß ja nicht, was der OP damit anstellen will.

    Bei Zufallssequenzen lassen sich tolle Sachen modellieren, das sollte man dann aber als Markow-Kette machen.
    Multigrad - 360°-Produktfotografie für den Mac
  • Ich greife das nochmal auf, auch wenn der Thread schon etwas älter ist.

    Wenn man von Zufallszahlen ausgeht, fällt mir spontan so ein Lottozahlengenerator ein. Da gibts ja auch keine doppelten Zahlen.
    Hier soll aber nur geprüft werden, ob die aktuelle Zahl, nicht die letzte Zahl ist.
    Ich würde in einer while checken, ob die aktuelle Zahl gleich die letzte ist und das so lange machen, bis es nicht mehr so ist.
    Ich bin gegen Signaturen!!!
  • Man könnte auch ne Array haben wo alle Zahlen drinn sind. Wird eine Zahl gewählt, wird die Zahl aus der Array genommen. Dann verkürzt sich diese um 1 und die nächste Zahl kann kommen. Gerade für den Lotto Hintergrund wäre das machbar. In diesem fall wird eben die Position der Zahl genommen anstatt die Zahl selbst.
    _____________________________
    Alle Angaben ohne Gewähr :)

    On the internet you can be anything you want. It's strange that so many people choose to be stupid.


    Superbientem animus prosternet
  • beage schrieb:

    Ich greife das nochmal auf, auch wenn der Thread schon etwas älter ist.

    Wenn man von Zufallszahlen ausgeht, fällt mir spontan so ein Lottozahlengenerator ein. Da gibts ja auch keine doppelten Zahlen.
    Hier soll aber nur geprüft werden, ob die aktuelle Zahl, nicht die letzte Zahl ist.
    Ich würde in einer while checken, ob die aktuelle Zahl gleich die letzte ist und das so lange machen, bis es nicht mehr so ist.


    das wär wohl keine so gute idee denn dann kanns du für die hälfte der ziehungen genau eine zahl bekommen...
  • gritsch schrieb:

    beage schrieb:

    Ich greife das nochmal auf, auch wenn der Thread schon etwas älter ist.

    Wenn man von Zufallszahlen ausgeht, fällt mir spontan so ein Lottozahlengenerator ein. Da gibts ja auch keine doppelten Zahlen.
    Hier soll aber nur geprüft werden, ob die aktuelle Zahl, nicht die letzte Zahl ist.
    Ich würde in einer while checken, ob die aktuelle Zahl gleich die letzte ist und das so lange machen, bis es nicht mehr so ist.


    das wär wohl keine so gute idee denn dann kanns du für die hälfte der ziehungen genau eine zahl bekommen...


    hae? Erklär das mal bitte. Ist wohl noch zu früh als das ich das kapieren würde.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • gritsch schrieb:

    macmoonshine schrieb:

    beage schrieb:

    Ich würde in einer while checken, ob die aktuelle Zahl gleich die letzte ist und das so lange machen, bis es nicht mehr so ist.

    Dann kann jedoch die aktuelle Zahl gleich der vorletzten sein. Das Vorgehen von Alex ist nicht nur richtig sondern in der Regel auch effizienter...


    genau das meinte ich. also jede zweite zahl kann gleich sein.


    Das ist richig aber das wäre aber nach Anforderung des TO egal. Der wollte nur, dass nicht zeimal nacheinander die gleiche Zahl kommt. Das mit dem jede Zahl nur einmal wurde erst im Laufe des Threads von jemandem anderen aufgegriffen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    gritsch schrieb:

    macmoonshine schrieb:

    beage schrieb:

    Ich würde in einer while checken, ob die aktuelle Zahl gleich die letzte ist und das so lange machen, bis es nicht mehr so ist.

    Dann kann jedoch die aktuelle Zahl gleich der vorletzten sein. Das Vorgehen von Alex ist nicht nur richtig sondern in der Regel auch effizienter...


    genau das meinte ich. also jede zweite zahl kann gleich sein.


    Das ist richig aber das wäre aber nach Anforderung des TO egal. Der wollte nur, dass nicht zeimal nacheinander die gleiche Zahl kommt. Das mit dem jede Zahl nur einmal wurde erst im Laufe des Threads von jemandem anderen aufgegriffen.

    Gruß

    Claus


    wo sollte dann der vorteil einer schleife gegenüber genanntem code sein? bekommt man jetzt für zeit und strom verbrauchen pluspunkte? ;)
  • gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    macmoonshine schrieb:

    beage schrieb:

    Ich würde in einer while checken, ob die aktuelle Zahl gleich die letzte ist und das so lange machen, bis es nicht mehr so ist.

    Dann kann jedoch die aktuelle Zahl gleich der vorletzten sein. Das Vorgehen von Alex ist nicht nur richtig sondern in der Regel auch effizienter...


    genau das meinte ich. also jede zweite zahl kann gleich sein.


    Das ist richig aber das wäre aber nach Anforderung des TO egal. Der wollte nur, dass nicht zeimal nacheinander die gleiche Zahl kommt. Das mit dem jede Zahl nur einmal wurde erst im Laufe des Threads von jemandem anderen aufgegriffen.

    Gruß

    Claus


    wo sollte dann der vorteil einer schleife gegenüber genanntem code sein? bekommt man jetzt für zeit und strom verbrauchen pluspunkte? ;)


    Wo habe ich geschrieben das die Schleife besser ist? Ich habe lediglich geefragt wiso die deiner Meinung nach nicht korrekt ist und das ist sie wenn man die Anforderungen des TO betrachtet.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    macmoonshine schrieb:

    beage schrieb:

    Ich würde in einer while checken, ob die aktuelle Zahl gleich die letzte ist und das so lange machen, bis es nicht mehr so ist.

    Dann kann jedoch die aktuelle Zahl gleich der vorletzten sein. Das Vorgehen von Alex ist nicht nur richtig sondern in der Regel auch effizienter...


    genau das meinte ich. also jede zweite zahl kann gleich sein.


    Das ist richig aber das wäre aber nach Anforderung des TO egal. Der wollte nur, dass nicht zeimal nacheinander die gleiche Zahl kommt. Das mit dem jede Zahl nur einmal wurde erst im Laufe des Threads von jemandem anderen aufgegriffen.

    Gruß

    Claus


    wo sollte dann der vorteil einer schleife gegenüber genanntem code sein? bekommt man jetzt für zeit und strom verbrauchen pluspunkte? ;)


    Wo habe ich geschrieben das die Schleife besser ist? Ich habe lediglich geefragt wiso die deiner Meinung nach nicht korrekt ist und das ist sie wenn man die Anforderungen des TO betrachtet.

    Gruß

    Claus


    ich hab die originalfrage natürlich nicht mehr gelesen sondern nur das was er geschrieben hat (von wegen lottozahlen). dass das dann überhaupt nichts mit seinem vorschlag zu tun hat habe ich überlesen...
  • Dass Lottozahlen und das TO komplett unterschiedliche Probleme sind ist mittlerweile klar.

    Unabhängig davon ist es _immer_ falsch, ein Schleifenende ausschießlich von einer Zufallszahl abhängig zu machen (was in dem Fall von "hole eine neue Zufallszahl, bis sie bestimmte Kriterien entspricht" der Fall wäre). Der Grund ist eher theoretisch: Es lässt sich nicht mehr nachweisen, dass die Schleife überhaupt beendet wird. Ein echter Zufallszahlengenerator kann beliebig lange Sequenzen von ein und derselben Zahl erzeugen - die Wahrscheinlichkeit dafür geht gegen null, aber es ist nicht ausgeschlossen. EIn Programm, das für ein nachweislich entscheidbares Problem nicht nachweislich terminiert ist keine Lösung für das Problem.

    Jaja, Klugscheißerei, ich weiß. Das ist zwar ein sehr theoretisches Argument und solche unendlich langen Sequenzen kommen in der Praxis meistens nicht vor, andererseits entstehen viele Fehler in Software dadurch, dass irgendjemand irgendwann mal angenommen hat, dass ein bestimmter Fall in der Praxis nicht vorkommt.
    Multigrad - 360°-Produktfotografie für den Mac