12:00 Uhr Mittags, Hannover Markt. Und @fkleedorfer spricht schlecht über den Koch.
Das...
fkleedorfer | 24.10.15 10:27
Das ist überhaupt nicht wahr! @jensitus deliriert wohl!
fkleedorfer | 24.10.15 10:27
Keineswegs, mein Lieber, keineswegs
jensitus | 24.10.15 19:18
Kinder!
Fabsi | 26.10.15 17:05
Dafür hat @jensitus heute die netten angular programmierer übel kritisiert!
fkleedorfer | 26.10.15 18:31
Bis wieder einer weint!
Fabsi | 26.10.15 18:36
Angular bringt mich regelmäßig zum weinen
jensitus | 27.10.15 05:28
Zum Beispiel: Wie funktioniert eine random Abfrage, wisst ihr das?
jensitus | 27.10.15 06:39
Das war jetz ein bissl ungenau, so als Frage..
fkleedorfer | 27.10.15 07:40
Stimmt. Ich hab mehrere Lernkarten bspw und will davon eine randomisiert haben und anzeigen.
jensitus | 27.10.15 07:51
Ein erster Schritt: var c = Math.floor((Math.random()*Cards.all().length)+1); Edit: Das führt erstmal zu nix.
jensitus | 27.10.15 07:51
das muss dann aber am Cards.all().length liegen, der rest scheint zu passen
Fabsi | 27.10.15 08:14
Das Cards.all passt auch. Was nicht passt, ist, damit immer eine Ausgabe hinzubekommen. Wenn ein Eintrag in der DB fehlt, fehlt dann damit die entsprechende ID, sagen wir 5. Und wenn var c 5 ist, bleibt der Bildschirm leer.
jensitus | 27.10.15 08:21
aber Cards.all() repräsentiert alle in der DB vorhandenen Karten oder enthält Cards.all() mehr als in der DB?
Fabsi | 27.10.15 08:42
Nein, das passt schon. Das Problem ist, die Methode length gibt die korrekte Anzahl wieder, aber daraus eine randomisierte Nummer für die Abfrage zu nehmen, bringt nix, weil die IDs im Zweifel ganz andere sind. length ergibt 10, die IDs sind aber 1, 2, 3, 6, 7, 9, 11, 12, 14 und 15 Edit: Sprich, da muss was anderes her.
jensitus | 27.10.15 09:03
Was steht denn in dem Cards.all()-Array drinnen?
Fabsi | 27.10.15 09:09
id: 1, english: 'bone', german: 'knochen' id: 2 ... Sind Lernkarten zum Vokabellernen fürn Elias, und die sollen halt zufällig kommen
jensitus | 27.10.15 09:15
d.h. im array sind eh schon alle infos? warum kannst das dann nicht direkt per index ansprechen?
Fabsi | 27.10.15 09:24
Wie meinst du das?
jensitus | 27.10.15 11:59
Ach so! Jetzt versteh ich, du bist ja ein Fuchs!
jensitus | 27.10.15 12:07
Cards.all() liefert ein Array mit den Karten zurück, oder? Dann kannst ja sowas machen: var cards = Cards.all(); var randomlyChoosenCard = cards[Math.floor(Math.random() * cards.length)]
Fabsi | 27.10.15 12:07
und randomlyChoosenCard.id liefert dann vermutlich die DB-relevante ID
Fabsi | 27.10.15 12:08
Ja, schaut gut aus. Allerdings am Anfang und am Ende des Arrays stimmts noch nicht ganz.
jensitus | 27.10.15 12:16
Was genau?
Fabsi | 27.10.15 12:23
Den ersten Eintrag, also den mit index 0, hat er nicht genommen und dafür ist er beim letzten Eintrag um eins übers Ziel hinausgeschossen. So schaut es jetzt ganz gut aus: var cards = Cards.all(); var i = Math.floor((Math.random()*cards.length)+0); return cards[i];
jensitus | 27.10.15 12:38
ne idee warum?
Fabsi | 27.10.15 12:47
Wenn ich es richtig versteh muss man bei Math.floor((Math.random()*cards.length)+0) statt +1 schreiben. Es wird dann die 0 miteinbezogen und geht quasi nur bis zum tatsächlich letzten Element.
jensitus | 27.10.15 13:12
achsooo, jaja, das schon, das +1 hab ich oben eh auch schon weggelassen. mich hat nur irritiert, dass du "+0" geschrieben hast, was du ja auch weglassen kannst. hab mir gedacht, das ist irgend so ein schmee wie man es z.B. bei typumwandlungen mit "*1" macht.
Fabsi | 27.10.15 13:28
Stimmt, das kann man weglassen. Scheint der Default-Wert zu sein, oder wie verhält sich das?
jensitus | 27.10.15 13:37
Simple Mathematik: x + 0 = x :)
Fabsi | 27.10.15 14:30
ist kein zusätzlicher parameter
Fabsi | 27.10.15 14:30
So simpel. Allerdings wird da ja nicht addiert, sondern das markiert den Anfang, oder?
jensitus | 27.10.15 16:17
Nö, (Math.random() * 15), z.B. liefert Zahlen zwischen 0 und 14,99999... und mit Math.floor() rundest du das nun auf 0, 1, ..., bzw. 14 ab. Wenn du aber Zahlen zw. 1 und 15 haben willst, musst du einfach an einer Stelle +1 dazuzählen und das wurde in deinem Fall vor abgerundet wird gemacht, deswegen das "+1".
Fabsi | 27.10.15 16:25
Und wenn ich +2 dazu zähle, habe ich Zahlen zwischen 2 und 16, oder?
jensitus | 27.10.15 16:43
genau
Fabsi | 27.10.15 16:44
Das heißt, es ist keine Addition in klassischem Sinne sondern der Faktor, um den sich diese Reihe verschiebt?
jensitus | 27.10.15 17:03
Doch, klassischer geht's fast nimmer. Eine Reihe erhältst du ja eigentlich nicht, sondern immer nur einen konkrete Zahl pro Aufruf. Du könntest aber sagen, dass du den Ergebnisraum (oder wie auch immer das mathematisch genau heißt) um eins nach oben verschiebst.
Fabsi | 27.10.15 17:19
Wobei "oben" natürlich auch wieder relativ ist...
Fabsi | 27.10.15 17:21
Hm, also entweder verschiebe ich den Ergebnisraum von 15 Zahlen um 0, 1 oder 2, oder ich zähls zamm. Dann wäre der Ergebnisraum nicht verschoben sondern erweitert von 15 auf 16 oder 17, oder nicht?
jensitus | 27.10.15 17:38
Ich nehm eine Zahl, die einem Ergebnisraum entspringt, zähl eins dazu und das Ergebnis ist in einem neuen Ergebnisraum, der, in dem Fall, um eins verschoben ist.
Fabsi | 27.10.15 17:44
Zum Varruckt wern, aber wahrscheinlich hast du recht. Das mit dem dazuzählen, will mir noch nicht ganz in den Kopf.
jensitus | 27.10.15 17:52
I wea narrisch! Wenn du mir eine Zahl sagst und ich rechne immer eins dazu und sag dir dann das Ergebnis und du weißt, dass du immer nur Zahlen zwischen 0 und 14 sagst, weiß du automatisch auch, dass ich immer nur Zahlen zwischen 1 und 15 sagen werde.
Fabsi | 27.10.15 17:58
und trotzdem mach ich nix anderes als eine einfache Addition
Fabsi | 27.10.15 17:58
Hm
jensitus | 28.10.15 08:31
Ich glaube, das Missverständis ist: array-indices beginnen in javascript bei 0, nicht 1 (wie zb in R)
fkleedorfer | 28.10.15 08:37
Nein nein, das hab ich schon kapiert. Zu welcher Zahl die 1 oder die 2 dazu addiert wird, hab ich nicht kapiert. (Array indices beginnen doch meistens bei 0, oder?)
jensitus | 28.10.15 08:39
Spiel's einfach anhand eines Aufrufs der Funktion durch: zuerst wird die Funktion Math.random() aufgerufen und liefert z.B. 0.87 zurück, dann wird das mit cards.lenght multipliziert, sagen wir 15, d.h. wir haben jetzt 13,05. Jetzt würde die 1 dazugezählt werden (in unserem Fall aber eben nicht), d.h. 14,05 und dann wird noch das Math.floor(14,05) aufgerufen und liefert 14 zurück.
Fabsi | 28.10.15 08:43
Es ist ganz simpel, ich glaub du hast dich da nur ganz zu Beginn in eine Ecke (mit diesen komischen Reihen) reingedacht, die dich nicht weiterbringt und musst nur einen kleinen Schritt zurück machen.
Fabsi | 28.10.15 08:44
Ah, jetzt komm ich dahinter, stimmt schon. Es dämmerte mir eh schon in die Richtung. (Ich sag das jetzt, damit dein Blutdruck nicht steigt :-)
jensitus | 28.10.15 08:49
Das wärs ja noch, ein arithmetisch induzierter Herzinfarkt!
Fabsi | 28.10.15 09:01
Gott sei Dank, den haben wir verhindert! Vielen Dank für die Mühe!
jensitus | 28.10.15 09:37