Como una pequeña broma en la oficina, alguien quería un guión que escogiera un nombre al azar, y dicha persona haría una ronda de bebidas.
Llamemos a las personas John, Jeff, Emma, Steve y Julie.
Pensé que sería divertido hacer un guión que parezca aleatorio a simple vista, pero que en realidad siempre da a la misma persona que la salida (depende de ti quien elijas).
La respuesta más votada gana después de una semana
Y el ganador es....
Paul R con (actualmente) 158 votos.
Las respuestas aquí son geniales, y si alguien más tiene otras ideas que aún no se han publicado, agréguelas, me encanta leerlas.
Respuestas:
C
Es importante decidir quién está comprando lo más rápido posible, para no perder el tiempo precioso de beber, por lo tanto, C es la opción obvia para obtener el máximo rendimiento:
Explicación:
fuente
PHP
No podía dejarlo pasar, así que aquí hay otro:
fuente
Haskell
Es demasiado transparente si siempre devuelve el mismo nombre, así que intente lo siguiente
Siempre que quieras que sea aleatorio:
Y para tu objetivo desafortunado:
fuente
Bash: máxima simplicidad
Un ejemplo muy simple: evitemos cualquier problema haciéndolo en forma de libro de texto. ¡No olvide sembrar el generador del reloj del sistema para obtener un buen resultado!
Prima:
fuente
$SECONDS
ftw! \ o /source
esto, en lugar de solo ejecutarlo? ¿El shebang todavía desencadenará un nuevo caparazón o algo así?source
, es exactamente lo mismo que si hubiera escrito los comandos en la línea de comandos usted mismo; #! / bin / bash es un comentario, por lo que se ignora. Esto es cierto para cualquier script.C#
fuente
rng.Next()
solo se llama una vez, la matriz se ordenaría por una constante, lo que no produciría ningún cambio (o un cambio que dependa solo del algoritmo de clasificación).names = names.OrderBy(name => rng.Next());
=>
indica que esta es una expresión lambda de C # (cierre).Potencia Shell
Esto siempre saldrá
John
.fuente
Q
fuente
-S 1234
opción o hágalo\S 1234
desde el intérpretePerl
fuente
@
prefijo), en "contexto de lista", se interpreta como todos sus elementos, pero en "contexto escalar", es un escalar igual al número total de elementos en la lista. Por lo tanto, dentro de la cadena, la variable de lista tiene contexto de lista y se interpola, y obtenemosPerson X is buying
. Pero como un índice de matriz, obtiene un contexto escalar y se interpreta como 1.my @index = ...
, inmediatamente se pregunta "WTF ?!".my @letters = 'a' .. 'z';
my @squares = map $_**2, 1..20;
my @sorted = sort { lc $a cmp lc $b } @words;
etc.ECMAScript
Es siempre recoge Julie.
fuente
(a,b)=>(a=b[0],b)
). He aclarado mi respuesta.C#
fuente
var random = new Random(5); var id = random.NextInt(5);
C#
Insinuación:
Responder:
fuente
AddRange
confundirmeConcat
al agregar nombres a aList<string>
. Se me ocurrió tener un Hashset con un IEqualityComparer astuto, pero sería demasiado inusual. En mi crédito, no había muchas (si las hubo) respuestas basadas en semillas cuando publiqué esto.bash / coreutils
Esto se toma casi al pie de la letra de un guión que escribí con un propósito similar.
fuente
-r
especifica el orden inverso (lexicográfico), por lo que Steve siempre será elegido. Podría verse como un error tipográfico inocente de-R
clasificación aleatoriaRubí
fuente
Rubí
fuente
Perl
¡tres
srand
s lo harán tres veces más aleatorio!explicación
editar:
Después de revisar el código, uno de los cinco chicos decidió arreglar el error obvio, produciendo el siguiente programa:
¿Puedes decir quién lo hizo simplemente mirando el código?
explicación:
fuente
$RANDOM
es una característica real en bash, ksh y zsh (pero no en perl).Pitón
Todo el mundo sabe que no puedes confiar en la aleatoriedad en un espacio de muestra tan pequeño; para hacerlo verdaderamente aleatorio, he abandonado el método anticuado de elegir un nombre de una lista, y en su lugar, mi programa deletreará un nombre completamente aleatorio. Como la mayoría de los nombres en la oficina tenían 4 letras, nos conformaremos con eso.
fuente
C
Lo siento Jeff!
fuente
C ++ x11
fuente
Scala
Sé que mis usuarios serán escépticos, ¡así que he incluido una prueba de que mi aleatoriedad es realmente justa!
Un ejemplo de ejecución:
A menos que alguien tenga mucha suerte, John siempre comprará las bebidas.
fuente
Javascript (con Underscore.js )
Como javascript no tiene un shuffle integrado, utilizaremos Underscore.js
fuente
JavaScript
Segundo intento, este es un poco más complicado:
fuente
N
función arbitraria -ary en JavaScript sabe acerca de laarguments
variable.C ++
Para ser justos, debemos realizar muchos, muchos ensayos y elegir a quien se seleccione con mayor frecuencia.
fuente
1<<31 == 0x80000000
no importa qué, por la definición misma<<
y en el complemento de 2 de 32 bits, eso esINT_MIN
. ¿Quizás estás pensando en1<<32
cuál puede o no== 0
? (Porque en x86,1<<32
generalmente se evalúa a 1 ...)T-SQL (2008+)
Explicación:
Mejora sugerida:
fuente
Lua
fuente
math.random()
sin argumentos también devuelve un número en el rango[0,1)
. -1 por no atrapar eso.Idiomatic C ++ 11
Cuando se trata de bebidas, es especialmente importante estar al día con los últimos estándares y estilos de codificación; Este es un gran ejemplo de un selector de nombres C ++ 11 altamente eficiente y compatible con modismos.
Se siembra desde el reloj del sistema y genera la semilla junto con el nombre para la verificación cada vez.
Prueba esto en vivo: http://ideone.com/KOet5H
fuente
JavaScript
fuente
Pitón
fuente
random.seed()
debe ser2
(el predeterminado). Si pasaversion=1
, elhash()
de la cadena se usará como una semilla en lugar de la cadena completa, y debido a que Python siembra aleatoriamente los valores hash de las cadenas que comienzan en 3.2, obtendrá un nombre realmente aleatorio.Perl
¡Es mejor que Emma no olvide su bolso! Corre debajo
strict
ywarnings
.fuente
JavaScript
fuente
parseInt(Math.random(0, 4))
y tal vez agregaría comentarios como:Math.random
devuelve un doble, así que conviértalo primero en un número enteroMath.random
no le importan nuestros escasos parámetros. Elige los números a su manera. El|0
está redondeando correctamente el resultado inesperado, por lo que no es una fuente de ningún truco.|0
es muy obvio para algunos (todos nosotros muy probablemente), pero apuesto a que hay muchos que no tienen idea de lo que hace. Ese es el grupo en el que confiaba engañando.|0
, si sabes lo que hace, parece que se está redondeando hacia abajo, y se está redondeando hacia abajo, por lo que no es un engaño. (Y si alguien no tiene idea de lo que|0
hace, entonces no sirve de nada el código engañoso; simplemente puede decirle lo que quiera que crea). En cambio, el comportamiento inesperado en su respuesta se basa en el hecho de queMath.random(0,4)
es funcionalmente idéntico aMath.random()
, porqueMath.random
no usa parámetros.J
Pobre Julie ... Trivia: esta podría haber sido la J más limpia que he escrito ...
fuente