Als kleiner Scherz im Büro wollte jemand ein Skript, das zufällig einen Namen auswählt, und diese Person wird eine Runde Getränke machen.
Nennen wir die Leute John, Jeff, Emma, Steve und Julie.
Ich dachte, es wäre lustig, ein Skript zu erstellen, das auf den ersten Blick zufällig erscheint, aber tatsächlich immer die gleiche Person wie die Ausgabe enthält (Sie entscheiden selbst, wen Sie wählen).
Die Antwort mit der höchsten Stimmenzahl gewinnt nach einer Woche
Und der Gewinner ist....
Paul R mit (derzeit) 158 Stimmen.
Die Antworten hier sind großartig, und wenn jemand andere Ideen hat, die noch nicht veröffentlicht wurden, fügen Sie sie bitte hinzu. Ich liebe es, sie durchzulesen.
Antworten:
C
Es ist wichtig zu entscheiden, wer so schnell wie möglich kauft, um keine kostbare Trinkzeit zu verschwenden - daher ist C die offensichtliche Wahl, um maximale Leistung zu erzielen:
Erläuterung:
quelle
PHP
Konnte das nicht loslassen, also hier ist noch einer:
quelle
Haskell
Es ist zu transparent, wenn immer derselbe Name zurückgegeben wird. Versuchen Sie Folgendes
Wann immer Sie wollen, dass es zufällig ist:
Und für dein unglückliches Ziel:
quelle
Bash - maximale Einfachheit
Ein sehr einfaches Beispiel - lassen Sie uns Probleme vermeiden, indem Sie es wie im Lehrbuch machen. Vergessen Sie nicht, den Generator von der Systemuhr zu trennen, um ein gutes Ergebnis zu erzielen!
Bonus:
quelle
$SECONDS
ftw! \ o /source
dies tun, anstatt es nur auszuführen? Wird der Schebang immer noch eine neue Muschel auslösen oder so?source
ist es genau so, als ob Sie die Befehle in der Befehlszeile selbst eingegeben hätten. #! / bin / bash ist ein Kommentar, der ignoriert wird. Dies gilt für jedes Skript.C #
quelle
rng.Next()
das Array , da es nur einmal aufgerufen wird, nach einer Konstanten sortiert wird, was zu keiner Änderung führt (oder zu einer Änderung, die nur vom Sortieralgorithmus abhängt).names = names.OrderBy(name => rng.Next());
=>
zeigt an, dass dies ein C # -Lambda-Ausdruck (Closure) ist.Power Shell
Dies wird immer ausgegeben
John
.quelle
Q.
quelle
-S 1234
\S 1234
Perl
quelle
@
Präfix) wird im "Listenkontext" als alle ihre Elemente interpretiert, im "skalaren Kontext" ist sie jedoch ein Skalar, der der Gesamtzahl der Elemente in der Liste entspricht. Daher hat die Listenvariable innerhalb des Strings einen Listenkontext und wird interpoliert, und wir erhaltenPerson X is buying
. Als Array-Index erhält er jedoch einen skalaren Kontext und wird als 1 interpretiert.my @index = ...
, sofort "WTF ?!" fragt.my @letters = 'a' .. 'z';
my @squares = map $_**2, 1..20;
my @sorted = sort { lc $a cmp lc $b } @words;
etc.ECMAScript
Es nimmt immer Julie.
quelle
(a,b)=>(a=b[0],b)
) benutze . Ich habe meine Antwort geklärt.C #
quelle
var random = new Random(5); var id = random.NextInt(5);
C #
Hinweis:
Antworten:
quelle
AddRange
durcheinander zu kommen,Concat
wenn ich Namen zu a hinzufügeList<string>
. Mir ist der Gedanke gekommen, ein Hashset mit einem hinterhältigen IEqualityComparer zu haben, aber es wäre einfach viel zu ungewöhnlich. In meinem Kredit gab es nicht viele (wenn überhaupt) Samen-basierte Antworten, als ich dies gepostet habe.Bash / Coreutils
Dies ist fast wörtlich aus einem Skript entnommen, das ich für einen ähnlichen Zweck geschrieben habe.
quelle
-r
Gibt die umgekehrte (lexikografische) Sortierung an, sodass Steve immer ausgewählt wird. Es könnte als ein unschuldiger Tippfehler von gesehen werden-R
für zufällige Sortierung angesehen werdenRubin
quelle
Rubin
quelle
Perl
drei
srand
s machen es dreimal zufälliger!Erläuterung
bearbeiten:
Nachdem einer der fünf Entwickler den Code durchgearbeitet hat, hat er beschlossen, den offensichtlichen Fehler zu beheben, und das folgende Programm erstellt:
Kannst du sagen, wer es getan hat, indem du dir den Code ansiehst?
Erläuterung:
quelle
$RANDOM
ist ein echtes Feature in Bash, Ksh und Zsh (aber nicht in Perl).Python
Jeder weiß, dass man in einem so kleinen Probenraum der Zufälligkeit nicht trauen kann; Um es wirklich zufällig zu machen, habe ich die veraltete Methode zum Auswählen eines Namens aus einer Liste aufgegeben. Stattdessen schreibt mein Programm einen vollständig zufälligen Namen. Da die meisten Namen im Büro 4 Buchstaben hatten, werden wir uns damit abfinden.
quelle
C
Entschuldigung, Jeff!
quelle
C ++ x11
quelle
Scala
Ich weiß, dass meine Benutzer skeptisch sind, daher habe ich einen Beweis dafür beigelegt, dass meine Zufälligkeit wirklich fair ist!
Ein Beispiellauf:
John kauft immer die Getränke, es sei denn, jemand anderes hat großes Glück.
quelle
Javascript (mit Underscore.js )
Da in Javascript kein Shuffle integriert ist, verwenden wir Underscore.js
quelle
JavaScript
Zweiter Versuch, dies ist ein bisschen kniffliger:
quelle
N
in JavaScript eine beliebige Funktion erstellt hat, kennt diearguments
Variable.C ++
Um fair zu sein, sollten wir viele, viele Versuche durchführen und auswählen, wer am häufigsten ausgewählt wird.
quelle
1<<31 == 0x80000000
Egal was, genau definiert<<
und im 32-Bit-2-Komplement, das ist esINT_MIN
. Denken Sie vielleicht darüber nach,1<<32
welche vielleicht oder welche nicht== 0
? (Weil auf x86, in der1<<32
Regel 1 auswertet ...)T-SQL (2008+)
Erläuterung:
Verbesserungsvorschlag:
quelle
Lua
quelle
math.random()
Ohne Argumente wird auch eine Zahl im Bereich zurückgegeben[0,1)
. -1 für das nicht fangen.Idiomatisches C ++ 11
Wenn es um Getränke geht, ist es besonders wichtig, mit den neuesten Standards und Codierungsstilen auf dem Laufenden zu sein. Dies ist ein großartiges Beispiel für eine hocheffiziente und idiomkompatible C ++ 11-Namensauswahl.
Es wird von der Systemuhr geimpft und gibt den Startwert zusammen mit dem Namen jedes Mal zur Überprüfung aus.
Versuchen Sie dies live: http://ideone.com/KOet5H
quelle
JavaScript
quelle
Python
quelle
random.seed()
müssen2
(die Standardeinstellung). Wenn Sie übergebenversion=1
, wird derhash()
von der Zeichenfolge als Startwert anstelle der gesamten Zeichenfolge verwendet, und da Python die Hashwerte der Zeichenfolgen ab 3.2 zufällig einsetzt, erhalten Sie einen tatsächlich zufälligen Namen.Perl
Emma sollte ihren Geldbeutel besser nicht vergessen! Läuft unter
strict
undwarnings
.quelle
JavaScript
quelle
parseInt(Math.random(0, 4))
Kommentare wie "-Math.random
return a double" machen und vielleicht hinzufügen würde , konvertieren Sie diese zuerst in eine GanzzahlMath.random
sich nichts für unsere mageren Parameter interessiert. Es wählt die Zahlen auf seine Weise. das|0
ist das unerwartete Ergebnis korrekt Rundung, und so ist keine Quelle eines trickery.|0
ist für einige sehr offensichtlich (wahrscheinlich für uns alle), aber ich wette, es gibt eine Menge, die keine Ahnung haben, was es tut. Das ist die Gruppe, auf die ich mich verlassen habe.|0
, wenn du weißt, was es tut, sieht es so aus, als würde es abrunden, und es wird abgerundet, also ist es keine Täuschung. (Und wenn jemand keine Ahnung hat , was der|0
Fall ist, dann gibt es keine Verwendung für trügerisch Code;. Sie kann nur sagen , was Sie wollen , dass sie glauben) Stattdessen das unerwartete Verhalten in Ihrer Antwort beruht auf der Tatsache , dassMath.random(0,4)
zu funktional identisch istMath.random()
, weilMath.random
verwendet keine Parameter.J
Die arme Julie ... Trivia: Das war vielleicht das sauberste J, das ich je geschrieben habe ...
quelle