Comme petite blague dans le bureau, quelqu'un a voulu un script qui choisit un nom au hasard, et cette personne fera une tournée de boissons.
Appelons les gens John, Jeff, Emma, Steve et Julie.
J'ai pensé qu'il serait amusant de créer un script qui semble aléatoire au premier abord, mais qui donne en fait toujours la même personne que la sortie (à vous de choisir).
Le vote le plus voté gagne après une semaine
Et le gagnant est....
Paul R avec (actuellement) 158 votes.
Les réponses sont excellentes, et si quelqu'un d'autre a des idées qui n'ont pas encore été affichées, ajoutez-les, j'aime les lire.
Réponses:
C
Il est important de décider qui achète le plus rapidement possible afin de ne pas perdre de temps précieux à boire. C est donc le choix évident pour obtenir les performances maximales:
Explication:
la source
PHP
Je ne pouvais pas laisser passer ça, alors en voici un autre:
la source
Haskell
Il est trop transparent s'il renvoie toujours le même nom, alors essayez ce qui suit.
Chaque fois que vous voulez que ce soit aléatoire:
Et pour votre cible malheureuse:
la source
Bash - simplicité maximale
Un exemple très simple: évitons les problèmes en procédant de la manière habituelle. N'oubliez pas d'ensemencer le générateur à partir de l'horloge système pour obtenir un bon résultat!
Prime:
la source
$SECONDS
ftw! \ o /source
cela, au lieu de simplement l'exécuter? Est-ce que le shebang déclenchera toujours une nouvelle coquille ou quelque chose?source
alors c'est exactement la même chose que si vous aviez tapé les commandes sur la ligne de commande vous-même; #! / bin / bash est un commentaire donc il est ignoré. Cela est vrai de n'importe quel script.C #
la source
rng.Next()
n'est appelé qu'une fois, le tableau serait trié par une constante, ce qui n'entraînerait aucun changement (ou un changement qui dépend uniquement de l'algorithme de tri).names = names.OrderBy(name => rng.Next());
=>
signe qu'il s'agit d'une expression lambda en C # (fermeture).PowerShell
Ce sera toujours la sortie
John
.la source
Q
la source
-S 1234
option ou faites-le à\S 1234
partir de l'interprètePerl
la source
@
préfixe), dans "list context", est interprétée comme tous ses éléments, mais dans "scalar context", est un scalaire égal au nombre total d'éléments de la liste. Par conséquent, à l'intérieur de la chaîne, la variable de liste a un contexte de liste et est interpolée, et nous obtenonsPerson X is buying
. Mais en tant qu'indice de tableau, il obtient un contexte scalaire et est interprété comme 1.my @index = ...
, il se demande immédiatement "WTF ?!".my @letters = 'a' .. 'z';
my @squares = map $_**2, 1..20;
my @sorted = sort { lc $a cmp lc $b } @words;
etc.ECMAScript
Il choisit toujours Julie.
la source
(a,b)=>(a=b[0],b)
). J'ai clarifié ma réponse.C #
la source
var random = new Random(5); var id = random.NextInt(5);
C #
Allusion:
Répondre:
la source
AddRange
embrouilléConcat
lors de l’ajout de noms à unList<string>
. Il m'est arrivé d'avoir un hachage avec un IEqualityComparer sournois, mais ce serait bien trop inhabituel. À mon crédit, il n'y avait pas beaucoup (le cas échéant) de réponses basées sur les semences lorsque j'ai posté ceci.bash / coreutils
Ceci est repris presque textuellement d'un script que j'ai écrit dans un but similaire.
la source
-r
spécifie le tri inverse (lexicographique), donc Steve sera toujours sélectionné. Cela pourrait être vu comme une typo innocente ou-R
pour une sorte aléatoireRubis
la source
Rubis
la source
Perl
trois
srand
s le rendra trois fois plus aléatoire!explication
modifier:
après avoir lu le code, l’un des cinq gars a décidé de corriger l’erreur évidente en produisant le programme suivant:
pouvez-vous dire qui l'a fait juste en regardant le code?
explication:
la source
$RANDOM
est une vraie fonctionnalité dans bash, ksh et zsh (mais pas en perl).Python
Tout le monde sait que vous ne pouvez pas faire confiance au hasard dans un si petit espace échantillon; pour le rendre vraiment aléatoire, j'ai abandonné la méthode obsolète de choisir un nom dans une liste et mon programme épelera un nom complètement aléatoire. Comme la plupart des noms dans le bureau avaient 4 lettres, nous nous en contenterons.
la source
C
Désolé, Jeff!
la source
C ++ x11
la source
Scala
Je sais que mes utilisateurs seront sceptiques, j'ai donc inclus une preuve que mon caractère aléatoire est vraiment juste!
Un exemple exécuté:
À moins que quelqu'un d'autre ait beaucoup de chance, John achètera toujours les boissons.
la source
Javascript (avec Underscore.js )
Comme javascript n’a pas de shuffle intégré, nous utiliserons Underscore.js
la source
JavaScript
Deuxième essai, celui-ci est un peu plus compliqué:
la source
N
fonction -ary arbitraire en JavaScript connaît laarguments
variable.C ++
Pour être juste, nous devrions faire beaucoup d'essais et choisir celui qui est sélectionné le plus souvent.
la source
1<<31 == 0x80000000
peu importe la définition même de<<
, et sur le complément de 32 bits 2, c'estINT_MIN
. Pensez-vous peut-être à1<<32
ce qui peut ou non== 0
? (Parce que sur x86,1<<32
évalue généralement à 1 ...)T-SQL (2008+)
Explication:
Amélioration suggérée:
la source
Lua
la source
math.random()
sans argument renvoie également un nombre dans la plage[0,1)
. -1 pour ne pas attraper ça.Idiomatic C ++ 11
Lorsque des boissons sont en jeu, il est particulièrement important d’être à jour avec les normes et les styles de codage les plus récents. c’est un excellent exemple de sélecteur de noms C ++ 11 extrêmement efficace et conforme aux normes idiomatiques.
Elle est générée à partir de l'horloge système et la sort avec le nom pour vérification à chaque fois.
Essayez ceci en direct: http://ideone.com/KOet5H
la source
JavaScript
la source
Python
la source
random.seed()
doit être2
(valeur par défaut). Si vous réussissezversion=1
, le nomhash()
de la chaîne sera utilisé comme une valeur de départ au lieu de la totalité de la chaîne. Etant donné que Python génère de manière aléatoire les valeurs de hachage des chaînes à partir de 3.2, vous obtiendrez un nom réellement aléatoire.Perl
Emma ferait mieux de ne pas oublier son sac à main! Fonctionne sous
strict
etwarnings
.la source
JavaScript
la source
parseInt(Math.random(0, 4))
et peut-être ajouter des commentaires comme -Math.random
retourne un double, convertissez-le donc d'abord en entierMath.random
ne tenons pas compte de nos maigres paramètres. Il choisit les numéros à sa manière. elle|0
arrondit correctement le résultat inattendu et ne constitue donc pas une source de tromperie.|0
C’est très évident pour certains (nous tous, probablement), mais je parierais que beaucoup n’ont aucune idée de ce qu’il fait. C'est le groupe sur lequel je m'appuyais.|0
, si vous savez ce qu'il fait, ressemble il est arrondi vers le bas, et il est arrondi vers le bas, il est donc pas une tromperie. (Et si quelqu'un n'a aucune idée de ce qu'il|0
fait, le code trompeur ne sert à rien; vous pouvez simplement lui dire ce que vous voulez qu'il croie.) Au lieu de cela, le comportement inattendu de votre réponse est basé sur le fait qu'ilMath.random(0,4)
est fonctionnellement identique àMath.random()
, parce queMath.random
n'utilise pas de paramètres.J
Pauvre Julie ... Question: ça aurait pu être le J le plus propre que j'ai jamais écrit ...
la source