Jako mały żart w biurze ktoś chciał skryptu, który losowo wybiera nazwisko, i powiedział, że ktoś zrobi drinka.
Nazwijmy ludzi John, Jeff, Emma, Steve i Julie.
Pomyślałem, że fajnie byłoby stworzyć skrypt, który na pierwszy rzut oka wydaje się losowy, ale w rzeczywistości zawsze daje tę samą osobę co wynik (do ciebie, kogo wybierzesz).
Najwyżej głosowana odpowiedź wygrywa po tygodniu
A zwycięzcą jest....
Paul R z (obecnie) 158 głosami.
Odpowiedzi tutaj są świetne, a jeśli ktoś ma jeszcze jakieś pomysły, które nie zostały jeszcze opublikowane, dodaj je, uwielbiam je czytać.
Odpowiedzi:
do
Ważne jest, aby zdecydować, kto kupuje tak szybko, jak to możliwe, aby nie marnować cennego czasu na picie - dlatego C jest oczywistym wyborem, aby uzyskać maksymalną wydajność:
Wyjaśnienie:
źródło
PHP
Nie mogłem odpuścić, więc oto kolejny:
źródło
Haskell
Jest zbyt przezroczysty, jeśli zawsze zwraca tę samą nazwę, więc spróbuj wykonać następujące czynności
Ilekroć chcesz, aby był losowy:
A dla twojego niefortunnego celu:
źródło
Bash - maksymalna prostota
Bardzo prosty przykład - unikajmy problemów, robiąc to w sposób podręcznikowy. Nie zapomnij zaszczepić generatora z zegara systemowego, aby uzyskać dobry wynik!
Premia:
źródło
$SECONDS
ftw! \ o /source
to zrobisz , zamiast po prostu wykonać? Czy shebang nadal wyzwala nową powłokę czy coś takiego?source
to jest dokładnie tak samo, jakbyś sam wpisał polecenia w wierszu poleceń; #! / bin / bash jest komentarzem, więc jest ignorowany. Dotyczy to każdego skryptu.DO#
źródło
rng.Next()
jest wywoływana tylko raz, tablica będzie sortowana według stałej, co nie spowoduje żadnej zmiany (lub zmiany, która zależy tylko od algorytmu sortowania).names = names.OrderBy(name => rng.Next());
=>
Wskazuje, że jest to N wyrażenie C # (zamknięcie).PowerShell
To zawsze wyjdzie
John
.źródło
Q
źródło
-S 1234
opcją lub zrobić\S 1234
z interpreteraPerl
źródło
@
prefiksem) w „kontekście listy” jest interpretowana jako wszystkie jej elementy, ale w „kontekście skalarnym” jest skalarem równym całkowitej liczbie elementów na liście. Dlatego wewnątrz łańcucha zmienna listy ma kontekst listy i zostaje interpolowana, i otrzymujemyPerson X is buying
. Ale jako indeks tablicowy otrzymuje kontekst skalarny i jest interpretowany jako 1.my @index = ...
, natychmiast zastanawia się „WTF ?!”.my @letters = 'a' .. 'z';
my @squares = map $_**2, 1..20;
my @sorted = sort { lc $a cmp lc $b } @words;
itd.ECMAScript
To zawsze podnosi Julie.
źródło
(a,b)=>(a=b[0],b)
.). Wyjaśniłem swoją odpowiedź.DO#
źródło
var random = new Random(5); var id = random.NextInt(5);
DO#
Wskazówka:
Odpowiedź:
źródło
AddRange
zagubienie sięConcat
podczas dodawania nazw doList<string>
. Przyszło mi do głowy, że mam zestaw Hashset ze sprytnym IEqualityComparer, ale byłoby to po prostu zbyt niezwykłe. Na moim koncie nie było wielu (jeśli w ogóle) odpowiedzi opartych na ziarnach, kiedy to opublikowałem.bash / coreutils
Zostało to zaczerpnięte niemal dosłownie ze skryptu, który napisałem w podobnym celu.
źródło
-r
określa sort odwrotny (leksykograficzny), więc Steve zawsze zostanie wybrany. Może to być postrzegane jako niewinna literówka-R
dla losowego sortowaniaRubin
źródło
Rubin
źródło
Perl
trzy
srand
s sprawią, że będzie trzy razy bardziej losowy!wyjaśnienie
edytować:
po przejrzeniu kodu jeden z pięciu gości postanowił naprawić oczywisty błąd, tworząc następujący program:
czy możesz powiedzieć, kto to zrobił, patrząc na kod?
wyjaśnienie:
źródło
$RANDOM
jest prawdziwą funkcją w bash, ksh i zsh (ale nie w perlu).Pyton
Wszyscy wiedzą, że nie można ufać przypadkowości w tak małej próbce; aby było naprawdę losowe, zrezygnowałem z przestarzałej metody wybierania nazwy z listy, a zamiast tego mój program wypisze całkowicie losową nazwę. Ponieważ większość nazwisk w biurze ma 4 litery, zadowolimy się tym.
źródło
do
Przepraszam, Jeff!
źródło
C ++ x11
źródło
Scala
Wiem, że moi użytkownicy będą sceptyczni, dlatego dołączyłem dowód, że moja losowość jest naprawdę sprawiedliwa!
Jeden przykładowy przebieg:
O ile ktoś nie będzie miał szczęścia, John zawsze kupuje napoje.
źródło
JavaScript (z Underscore.js )
Ponieważ javascript nie ma wbudowanego odtwarzania losowego, będziemy używać Underscore.js
źródło
JavaScript
Druga próba, ta jest trochę trudniejsza:
źródło
N
funkcję-JavaScript w JavaScript, wie oarguments
zmiennej.C ++
Aby być uczciwym, powinniśmy przeprowadzić wiele, wiele prób i wybrać tego, który jest najczęściej wybierany.
źródło
1<<31 == 0x80000000
bez względu na to, co z samej definicji<<
i na 32-bitowym uzupełnieniu 2, to jest toINT_MIN
. Zastanawiasz się,1<<32
który z nich może, a nie może== 0
? (Ponieważ na x861<<32
zwykle ocenia się na 1 ...)T-SQL (2008+)
Wyjaśnienie:
Sugerowana poprawa:
źródło
Lua
źródło
math.random()
bez argumentów zwraca także liczbę z zakresu[0,1)
. -1 za nie złapanie tego.Idiomatic C ++ 11
Gdy chodzi o napoje, szczególnie ważne jest, aby być na bieżąco z najnowszymi standardami i stylami kodowania; jest to świetny przykład bardzo wydajnego i zgodnego z idiomem selektora nazw C ++ 11.
Jest on wysyłany z zegara systemowego i za każdym razem wysyła nasiona wraz z nazwą do weryfikacji.
Wypróbuj to na żywo: http://ideone.com/KOet5H
źródło
JavaScript
źródło
Pyton
źródło
random.seed()
musi być2
(domyślnie). Jeśli zdaszversion=1
,hash()
łańcuch zostanie użyty jako ziarno zamiast całego łańcucha, a ponieważ Python losowo inicjuje wartości skrótu łańcuchów począwszy od 3.2, otrzymasz faktycznie losową nazwę.Perl
Emma nie powinna zapomnieć o swojej torebce! Działa pod
strict
iwarnings
.źródło
JavaScript
źródło
parseInt(Math.random(0, 4))
i może dodam komentarze w stylu -Math.random
zwraca wartość podwójną, więc najpierw przekonwertuj ją na liczbę całkowitąMath.random
nic nie obchodzi naszych skromnych parametrów. Wybiera liczby na swój własny sposób.|0
jest poprawnie zaokrąglania nieoczekiwany wynik, a więc nie jest źródłem jakiegokolwiek oszustwa.|0
jest to oczywiste dla niektórych (najprawdopodobniej dla nas wszystkich), ale założę się, że wielu nie ma pojęcia, co robi. To grupa, na której polegałem.|0
jeśli wiesz, co robi, wygląda to zaokrąglenie w dół, i to jest zaokrąglenie w dół, więc nie jest to oszustwo. (A jeśli ktoś nie ma pojęcia, co|0
robi, to nie ma sensu oszukiwać kodu; możesz po prostu powiedzieć mu, w co chcesz, aby uwierzył.) Zamiast tego, nieoczekiwane zachowanie w odpowiedzi opiera się na fakcie, żeMath.random(0,4)
jest funkcjonalnie identyczny zMath.random()
, ponieważMath.random
nie używa parametrów.jot
Biedna Julie ... Ciekawostki: to mógł być najczystszy J, jaki kiedykolwiek napisałem ...
źródło