Gestern fragte ich diese Frage und bekam nie wirklich eine Antwort, mit der ich wirklich glücklich war. Ich würde wirklich gerne wissen, wie man eine Liste von N eindeutigen Zufallszahlen unter Verwendung einer funktionalen Sprache wie Ruby generiert, ohne im Stil extrem zwingend zu sein.
Da ich nichts gesehen habe, was ich wirklich mochte, habe ich die Lösung geschrieben, nach der ich in LINQ gesucht habe:
%Vor%Können Sie meinen LINQ in Ruby übersetzen? Python? Irgendeine andere funktionale Programmiersprache?
Hinweis: Bitte versuchen Sie, nicht zu viele Schleifen und Bedingungen zu verwenden - andernfalls ist die Lösung trivial. Außerdem würde ich lieber eine Lösung sehen, bei der Sie kein Array erzeugen müssen, das viel größer als N ist, so dass Sie dann einfach die Duplikate entfernen und auf N verkleinern können.
Ich weiß, dass ich wählerisch bin, aber ich würde wirklich gerne elegante Lösungen für dieses Problem sehen. Danke!
Bearbeiten:
Warum alle Downvotes?
Ursprünglich hatte mein Codebeispiel das Distinct () nach dem Take () welches, wie viele darauf hinwiesen, mir eine leere Liste hinterlassen konnte. Ich habe die Reihenfolge geändert, in der diese Methoden aufgerufen werden, um zu reflektieren, was ich überhaupt meinte.
Entschuldigung:
Mir wurde gesagt, dass dieser Beitrag ziemlich snobistisch wirkt. Ich wollte nicht implizieren, dass LINQ besser ist als Ruby / Python; oder dass meine Lösung viel besser ist als die von allen anderen. Meine Absicht ist nur zu lernen, wie man dies (mit bestimmten Einschränkungen) in Ruby macht. Es tut mir leid, wenn ich als Idiot hergekommen bin.
In Ruby:
%Vor%Update : Hier ist ein etwas anderer Weg: a = (0 ... 100) .entries.sort_by {rand} [0 ... 5]
BEARBEITEN:
und in Ruby 1.9 können Sie dies tun:
%Vor% Dies sollte 5 eindeutige Werte im Bereich 0 — 99
ergeben. Das xrange
-Objekt generiert Werte wie angefordert, so dass kein Speicher für Werte verwendet wird, die nicht abgetastet werden.
Ich werde auf die einfachsten Lösungen verzichten, indem ich das "zufällige" Modul benutze, da ich davon ausgehe, dass es nicht das ist, wonach Sie suchen. Hier ist, was ich denke, dass Sie in Python suchen:
%Vor%Um Ihnen zu zeigen, wie es funktioniert:
%Vor%Hier ist eine andere Ruby-Lösung:
%Vor%Ich denke, mit Ihrer LINQ-Anweisung wird der Distinct Dubletten entfernen, nachdem 5 bereits vergeben sind, so dass Sie nicht unbedingt 5 zurückbekommen. Jemand kann mich korrigieren, wenn ich falsch liege.
EDIT: Ok, nur zum Spaß, ein kürzerer und schneller (und immer noch mit Iteratoren).
%Vor%Ja, ich weiß, One-Liners sollten den Perl-Liebhabern überlassen werden, aber ich denke, dieser ist ziemlich mächtig, nicht wahr?
Alte Nachricht hier:
Mein Gott, wie kompliziert ist das alles! Lass uns Python sein:
%Vor%Genießen
EDIT: Wie Kommentatoren bemerkt haben, ist dies eine exakte Übersetzung des Fragecodes.
Um das Problem zu vermeiden, das wir durch das Entfernen von Duplikaten nach dem Erzeugen der Liste haben, was zu wenig Daten ergibt, können Sie einen anderen Weg wählen:
%Vor%Python mit numerischem Python:
%Vor%Voilà! Sicher könntest du etwas ähnliches in einem funktionalen Programmierstil tun, aber ... warum?
Nun, zuerst schreibst du LINQ in Python um. Dann ist Ihre Lösung ein One-Liner:)
%Vor%Wenn Sie alle oben genannten einfachen Methoden in ein Modul namens LINQ.py einsetzen, können Sie Ihre Freunde beeindrucken.
(Disclaimer: Das ist natürlich nicht das Umschreiben von LINQ in Python. Leute haben das Missverständnis, dass LINQ nur ein Haufen trivialer Erweiterungsmethoden und neuer Syntax ist. Der wirklich fortschrittliche Teil von LINQ Es handelt sich jedoch um eine automatische SQL-Generierung. Wenn Sie eine Datenbank abfragen, implementiert die Datenbank Distinct () und nicht die Clientseite.)
Hier ist eine Transliteration von Ihrer Lösung zu Python.
Zuerst ein Generator, der Zufallszahlen erzeugt. Dies ist nicht sehr Pythonic, aber es ist eine gute Übereinstimmung mit Ihrem Beispielcode.
%Vor%Hier ist eine Client-Schleife, die einen Satz von fünf verschiedenen Werten sammelt. Dies ist - wiederum - nicht die pythonischste Implementierung.
%Vor%Es ist nicht klar, warum Sie einen Generator für Zufallszahlen verwenden möchten - das ist eines der wenigen Dinge, die so einfach sind, dass ein Generator es nicht vereinfacht.
Eine eher pythonische Version könnte etwa so aussehen:
%Vor%Wenn die Anforderungen 5 Werte generieren und unter diesen 5 unterscheiden sollen, dann etwas wie
%Vor%Ich kann deine LINQ nicht wirklich lesen, aber ich denke, du versuchst, 5 Zufallszahlen von bis zu 100 zu erhalten und dann Duplikate zu entfernen.
Hier ist eine Lösung dafür:
%Vor%Aber vielleicht suchen Sie tatsächlich nach 5 verschiedenen Zufallszahlen zwischen 0 und 100. In diesem Fall:
%Vor%Nun, dies könnte Ihren Sinn für "nicht zu viele Loops" verletzen, aber vermutlich verstecken Take und Distinct nur die Schleife von Ihnen. Es wäre einfach genug, einfach Methoden zu Enumerable hinzuzufügen, um die while-Schleife auszublenden.
Tags und Links python ruby linq functional-programming