• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Cocoa uniq Zufallszahl

zorn

Zuccalmaglios Renette
Registriert
18.02.06
Beiträge
260
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?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Gib mal im Terminal ein:
Code:
man random
Da bekommst Du eine Beschreibung der Standard C Funktion random().

MacApple
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
Die hier versteh' ich nicht: if(!in_array($random, $slot)) $slot[] = $random;
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.
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
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.
 

zorn

Zuccalmaglios Renette
Registriert
18.02.06
Beiträge
260
@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?
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
...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?

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)
 

zorn

Zuccalmaglios Renette
Registriert
18.02.06
Beiträge
260
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...
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
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...

prozedural tut in dem beispiel aber garnichts zur Sache :p

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

zorn

Zuccalmaglios Renette
Registriert
18.02.06
Beiträge
260
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)
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
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...

Das mag etz arrogant klingen, aber welchen Teil von Skeeve's Beispiel hast Du denn nicht verstanden?
 

zorn

Zuccalmaglios Renette
Registriert
18.02.06
Beiträge
260
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...
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
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.
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)
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
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};
 

zorn

Zuccalmaglios Renette
Registriert
18.02.06
Beiträge
260
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?
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Ich ziehe 20x eine Zufallszahl zwischen 1 und 20. Was an dem Code verhindert dass ich 10x die 3 ziehe?
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...

;)
 

zorn

Zuccalmaglios Renette
Registriert
18.02.06
Beiträge
260
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...
 
  • Like
Reaktionen: Skeeve

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 :)