실제로 무작위가 아닌 임의의 스크립트


106

사무실에서 약간의 농담으로 누군가 이름을 무작위로 고르는 스크립트를 원했고 그 사람은 한 잔의 음료를 만들 것이라고 말했다.

John, Jeff, Emma, ​​Steve 및 Julie라는 사람들을 불러 봅시다.

나는 한 눈에 무작위로 보이는 스크립트를 만드는 것이 재미있을 것이라고 생각했지만 실제로는 항상 출력과 같은 사람을 선택합니다 (선택한 사람까지).

일주일 후에 가장 높은 투표 응답이 승리합니다.

그리고 승자는....

폴 R (현재 158 표)

여기에 대한 답변은 훌륭하며 다른 사람이 아직 게시되지 않은 다른 아이디어를 가지고 있다면 추가하십시오. 나는 그것을 통해 읽는 것을 좋아합니다.



6
@AstroCB 내가 좋아하는 것 중 하나. 바비 테이블 바로 뒤에 있습니다.
Cruncher

50
한 사람을 선택하지 않는 것을 제외하고는 무작위 인 경우 비명을 지르는 것처럼 보입니다.
Brendan Long

6
@ AstroCB 이것도 환상적입니다 : dilbert.com/strips/comic/2001-10-25
gilbertohasnofb

3
나는 첫 페이지를 보았습니다. 대부분의 답변은 항상 John을 선택하고, 2 위는 Julie, Jeff는 거의 선택하지 않고 Steve는 1을 선택합니다. Ray조차도 하나를 선택했지만 아무도 Emma를 선택하지 않았습니다. 이야기의 도덕 : 음료를 살 사람을 무작위로 결정하기 위해 줄을 서서 이름을 엠마로 지정하십시오.
Miserable Variable

답변:


171

귀중한 음주 시간을 낭비하지 않도록 가능한 빨리 구매하는 사람을 결정하는 것이 중요합니다. 따라서 최대 성능을 얻으려면 C 가 확실한 선택입니다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    const char *buyer;
    int n;

    srand(time(NULL)); // make sure we get a good random seed to make things fair !
    n = rand();
    switch (n % 5)
    {
        case 0: buyer = "John";
        case 1: buyer = "Jeff";
        case 2: buyer = "Emma";
        case 3: buyer = "Steve";
        case 4: buyer = "Julie";
    }
    printf("The person who is buying the drinks today is: %s !!!\n", buyer);
    return 0;
}

설명:

break;switch 문에 각 경우마다 이후 가 있으면 제대로 작동 합니다. 그러나 각 사례가 다음 사례로 넘어 질 수 있기 때문에 가난한 Julie는 항상 음료를 구매하게됩니다.


17
실제 다이를 굴리는 것보다 훨씬 빠른 성능 +1! ;)
Jwosty 2016 년

16
SIMD 또는 GPGPU를 사용하여 조금 더 성능을 높이기 위해 추가 최적화를 생각하고 있습니다. ;-)
Paul R

7
절대적으로 실제 라이브 적용 가능합니다. 아무리 작은 사고라도 의심 할 여지가 없습니다.
iFreilicht

5
그것은 단지 나입니까, 아니면 이것을 발견하기에는 너무 분명합니까?
Alvin Wong

3
@AlvinWong 나는 그것을 즉시 알아 차리지 못했습니다. 그런 다음 C를 정기적으로 사용하지 않거나 BCPL에서 유래 한 다른 언어를 사용하지 않습니다.
Rhymoid 2016 년

164

PHP

이것을 놓을 수 없으므로 여기에 다른 것이 있습니다.

$f = fopen('/dev/random','r');
$s = fread($f, 4);
fclose($f);

$names = ['John', 'Jeff', 'Emma', 'Steve', 'Julie'];

echo $names[$s % count($names)];

이것은 실제로 john을 생성한다고 보장되지는 않지만 가능성은 매우 높습니다. PHP는 / dev / random이 제공하는 모든 것을 행복하게 받아 들여 (아마도) 구문 분석 할 수없고 대신 매우 합리적인 숫자 0을 얻을 수 있다는 것을 알게됩니다. 결국, 프로그래머에게 잠재적 인 오류를 알리는 것은 PHP에서 치명적인 죄로 간주됩니다.


25
PHP를 좋아해야합니다. 더 나은 점은 때때로 다른 사람을 거의 선택하지 않을 것입니다. 운이 좋으면 처음에는 약간 편향된 것 같습니다
Falco

142
"... 프로그래머에게 잠재적 인 오류를 알리는 것은 PHP에서 치명적인 죄로 간주됩니다."
jsedano


85

하스켈

항상 같은 이름을 반환하면 너무 투명하므로 다음을 시도하십시오.

import Control.Monad
import System.Exit
import Control.Concurrent
import Control.Concurrent.MVar


data Person = John | Jeff | Emma | Steve | Julie deriving (Show, Enum)

next Julie = John
next p = succ p

rotate :: MVar Person -> IO ()
rotate mp = modifyMVar_ mp (return . next) >> rotate mp

main :: IO ()
main = do
    mp <- newMVar John
    forkIO $ rotate mp
    putStrLn "Shuffling"
    readMVar mp >>= print
    exitWith ExitSuccess

무작위로 원할 때마다 :

[~]$ runghc prog.hs
Shuffling
Steve

[~]$ runghc prog.hs
Shuffling
Julie

그리고 불행한 목표를 위해 :

[~]$ runhugs prog.hs
Shuffling
John

[~]$ runhugs prog.hs
Shuffling
John

포옹은 협력적인 멀티 태스킹 만 구현하므로 rotate스레드는 절대 실행되지 않습니다.


24
그것은 악마입니다!
Daenyth

8
아직 움직이지 않는 주사위를 촬영하는 것 같습니다.
Vi.

1
@Vi. 그것은 좋은 비유입니다. 운 좋게 MVars를 사용하면 사진이 흐려지지 않습니다. :)
모노 셀

@monocell 글쎄, 기술적으로는 움직이는 물체의 사진조차도 선명 할 수 있습니다.
ghosts_in_the_code

75

배쉬-최대 단순성

매우 간단한 예-교과서 방식으로 문제를 피하십시오. 좋은 결과를 얻으려면 시스템 시계에서 생성기를 시드하는 것을 잊지 마십시오!

#!/bin/bash

names=(John Jeff Emma Steve Julie)   # Create an array with the list of names
RANDOM=$SECONDS                      # Seed the random generator with seconds since epoch
number=$((RANDOM % 5))               # Pick a number from 0 to 4
echo ${names[number]}                # Pick a name

이것은 $SECONDS빌트인이 실제로 무엇을하는지 모르는 사용자에 의존합니다 . 현재 쉘이 시작된 이후의 시간 (초)을 리턴합니다. 스크립트에서와 마찬가지로 쉘은 항상 0 초 전에 시작되었으므로 생성기가 항상 시드 0되고 Julie는 항상 맥주를 구입합니다.

보너스:

이것은 정밀한 조사를 의미합니다. 스크립트 대신 명령 줄에 동일한 코드를 입력하면 $SECONDS사용자 대화 형 셸이 실행 된 시간이 반환 되므로 임의의 결과 가 나타납니다.


9
\ o / 의미 !!! 정말 의미 !!! $SECONDSftw! \ o /
yeti

source실행하지 않고 어떻게하면 되나요? shebang이 여전히 새로운 쉘 또는 무언가를 트리거합니까?
jpmc26 2016 년

1
@ jpmc26 : 당신이 그것을 실행한다면 그것은 source당신이 명령 행에 직접 명령을 입력 한 것과 정확히 같다; #! / bin / bash는 주석이므로 무시됩니다. 이것은 모든 스크립트에 해당됩니다.
Riot

57

씨#

using System;
using System.Linq;

namespace PCCG {
    class PCCG31836 {
        public static void Main() {
            var names = new string[]{ "John", "Jeff", "Emma", "Steve", "Julie" };
            var rng = new Random();
            names.OrderBy(name => rng.Next());
            Console.WriteLine(names[0]);
        }
    }
}

이것은 .Net API에 익숙한 사람들을 속일 수는 없지만 그것을 모르는 사람들은 그것을 OrderBy호출하는 객체 를 수정 한다고 생각할 수도 있으며 API 초보자가 만드는 것은 그럴듯한 오류입니다.


1
OrderBy가 객체를 가정적으로 수정 한 경우에도 해당 호출이 실제로 목록을 무작위로 정렬합니까? .NET에 익숙하지 않은 사람으로서, 첫 번째 추측은 rng.Next()한 번만 호출되었으므로 배열이 상수로 정렬되어 변경 (또는 정렬 알고리즘에만 의존하는 변경)이 발생하지 않는다는 것입니다.
Brilliand

1
@Brilliand OrderBy에 전달 된 인수는 정적 값이 아니며 요소가 정렬 될 때마다 실행되며이 경우 값을 비교하지 않고 임의의 값을 반환합니다. 행이 다음과 같은 경우 실제로 제대로 작동합니다.names = names.OrderBy(name => rng.Next());
user3188175

1
=>이것은 C # 1 람다 식 (폐쇄)임을 나타낸다.
Snowbody

44

PowerShell

$names = @{0='John'; 1='Jeff'; 2='Emma'; 3='Steve'; 4='Julie'}
$id = random -maximum $names.Length
$names[$id]

항상 출력 John됩니다.

$namesA는 System.Collections.Hashtable하지 않는 Length속성을. PowerShell v3부터는 Length또한 Count모든 객체의 속성으로 사용할 수 있습니다. 객체에 속성 1이 없으면 객체가 null이 아닌 경우 객체가 반환하고 그렇지 않으면를 반환 0합니다. 그래서 내 대답에서 $names.Length1로 평가되고 random -maximum 1최대 값이 배타적이므로 항상 0을 반환합니다.


42

show rand `John`Jeff`Emma`Steve`Julie;
exit 0;

Q는 항상 같은 값으로 난수 시드를 초기화합니다.


8
그래서 기본적으로는 전혀 임의의
샘 크리머

3
@SamCreamer이 질문의 목적은 결과를 무작위가 아닌 것으로 만드는 것입니다. 그러나 이것은 무작위로 보이므로 확실히 법안에 맞습니다
Cruncher

4
죄송합니다, Q의 임의의 숫자가 임의의 숫자가 아니라는 것을 의미했습니다.이 질문은 확실히 기준을 충족시킵니다. 그런 식으로 건너 오지 않았다!
Sam Creamer 2016 년

네, 랜드를 사용하고 싶을 때마다 랜덤 시드를 생성하는 자신 만의 방법을 찾아야합니까? 소리 ... 유용합니다.
DLeh

1
랜덤 시드를 매우 쉽게 수동으로 설정할 수 있습니다 ... -S 1234옵션으로 통역사를 시작하거나 통역사 \S 1234에서 수행
skeevey

34

use strict;

my @people = qw/John Jeff Emma Steve Julie/;
my @index = int(rand() * 5);

print "Person @index is buying: $people[@index]\n";

인쇄 : Person X is buying: Jeff(여기서 X는 0-4 임)

스칼라 컨텍스트를 약간 남용합니다. 목록 @index = int(rand() * 5)의 0 번째 위치에 0-4의 임의의 정수를 배치 @index합니다. 배열을 인쇄 할 때 @index에서 임의의 정수를 올바르게 인쇄하지만 @에서 배열 색인으로 사용할 때 $people[@index]@index는 스칼라 컨텍스트를 사용하여 목록 크기의 값 (예 :)을 제공합니다 1.

흥미롭게도 @people[@index]인덱스를 올바르게 만듭니다.

흥미롭게도 @people[@index]Perl의 해시 슬라이스는 충분 하므로 @index목록 컨텍스트에서 평가됩니다. 이 경우 단일 항목 목록이므로 올바르게 작동합니다.


따라서 C (++) 용어로 인덱싱 할 때 스칼라가 예상되므로 목록에서 스칼라로의 암시 적 변환이 발생합니까?
iFreilicht

@iFreilicht 맞습니다. Perl에서 표현식은 표시되는 위치에 따라 목록 또는 스칼라로 평가 될 수 있습니다. 결과적으로 동일한 표현은 상황에 따라 다른 의미를 가질 수 있습니다. @"리스트 컨텍스트"에서 목록 변수 (즉, 접두사가 있는 변수 )는 모든 요소로 해석되지만 "스칼라 컨텍스트"에서는 목록의 총 요소 수와 동일한 스칼라입니다. 따라서 문자열 내에서 list 변수는 list context를 가지며 보간되고 우리는 얻습니다 Person X is buying. 그러나 배열 인덱스로서 스칼라 컨텍스트를 얻고 1로 해석됩니다.
Allen G

3
이것에 대한 문제는 Perl 프로그래머가 볼 my @index = ...때 즉시 "WTF ?!"
derobert

@derobert, 왜 궁금하십니까? 당신은 그런 코드를 아주 자주 보게됩니다 ... my @letters = 'a' .. 'z'; my @squares = map $_**2, 1..20; my @sorted = sort { lc $a cmp lc $b } @words;등등.
Matthias

@Matthias 행이 단일 값을 선택하여 저장하기 때문에 스칼라 대신 배열에 저장됩니다.
derobert

23

ECMAScript

// Randomly pick a person on only one line!
var people = [('John', 'Jeff', 'Emma', 'Steve', 'Julie')];

console.log(people[new Date() % people.length | 0]);

그것은 항상 줄리을 선택합니다.

대괄호 안에 대괄호가 있으며 쉼표 연산자 는 오른쪽 피연산자의 값을 반환합니다.
놓치기도 쉽습니다. 나는 실제 코드 에서 그것을 놓쳤다 .


유쾌합니다. 마지막으로, 그 끔찍하고 끔찍한 연산자를 사용합니다.
Keen

5
이러한 맥락에서 쉼표는 기술적으로 구분자가 아니라 연산자입니다. ecma-international.org/ecma-262/5.1/#sec-11.14 그리고 그것은 끔찍합니다. 코드를 읽기 어려운 경우를 제외하고 여기서하는 것처럼 그래서, kudos.
Keen

2
@Cory 예, 동의합니다 (a,b)=>(a=b[0],b). 함수 표현식 (예 :)과 함께 코드 골프에 항상 사용합니다 . 내 대답을 명확하게했습니다.
칫솔

21

씨#

using System;

namespace LetsTroll {
    class Program {
        static void Main() {
            var names = new string[]{ "John", "Jeff", "Emma", "Steve", "Julie" };
            var random = new Random(5).NextDouble();
            var id = (int)Math.Floor(random);
            Console.WriteLine(names[id]);
        }
    }
}

이 방법을 사용 new Random().NextDouble()하면 0과 1 사이의 배가 반환 Math.Floor()됩니다.이 값 을 적용 하면 항상 0이됩니다.


24
그것은 나의 빠른 시선을 견뎌 내지 못했습니다. ;)
Martin Ender 2016 년

1
@TimS. 그런가요? : P
Knerd

2
+1, 훨씬 낫습니다-당신이 실제로하는 일을 알고 있지만 API에 익숙하지 않은 사람을 속일 수 있습니다.
Tim S.

1
나는 이것에 대해 모른다. 시드를 지정하려면 "랜덤"int를 얻는 적절한 방법을 사용하지 않는 것이 좋습니다.var random = new Random(5); var id = random.NextInt(5);
clcto

2
@clcto 내 의견으로는, 그것을 두 번 포함하면 누군가가 이중 테이크를하게하고 이유를 묻고 문제를 볼 가능성이 높습니다. 한 번만 포함하고 나중에 불필요한 코드를 포함하면 약간의 리디렉션 / 손해가 발생합니다. 보너스 : 누군가 버그 중 하나를 수정하면 다른 버그가 존재합니다.
Tim S.

18

씨#

var names = new string[] {"John", "Jeff", "Emma", "Steve", "Julie"};
var guidBasedSeed = BitConverter.ToInt32(new Guid().ToByteArray(), 0);
var prng = new Random(guidBasedSeed);
var rn = (int)prng.Next(0, names.Length);
Console.WriteLine(names[rn]);

힌트:

GUID에서 시드를 생성하십시오. 길드의 충돌 가능성은 4 × 10-10입니다. 슈퍼 랜덤.

대답:

적어도 당신이 사용할 때 Guid.NewGuid(), 으악! (종자를 항상 0으로 만드는 교묘 한 방법). 오 방향에 대한 무의미한 (int)


내가 할 수있는 다른 방법은에 이름을 추가 할 때 AddRange혼란스럽게 Concat하는 것 List<string>입니다. 비열한 IEqualityComparer가있는 Hashset을 갖기 위해 나에게 발생했지만 너무 이례적입니다. 내 신용으로 이것을 게시 할 때 씨앗 기반 답변이 많지 않은 경우가 많았습니다.
Nathan Cooper

나는 당신이했던 것과 같은 생각을 가지고 있다고 생각하지만, 당신은 조금 더 빨랐고 그것을보기가 더 어려워졌습니다. +1!
tsavinho

7
난수 생성기를 시드하는 것은 분명한 트릭이지만 여기에 숨겨져 있습니다. 사랑스러운 일.
TRiG

18

bash / coreutils

이것은 비슷한 목적으로 작성한 스크립트에서 거의 그대로 사용됩니다.

#!/bin/bash
# Sort names in random order and print the first
printf '%s\n' John Jeff Emma Steve Julie | sort -r | head -1

대문자 R을 잊어 버리는 것조차도 실제 스크립트에서 때때로 실수 한 것입니다.


3
더 잘 설명해 주시겠습니까? 현재는 짧고 bash에 익숙하지 않은 사람에게는 도움이되지 않습니다.
iFreilicht

6
-r역 (사전) 정렬을 지정하므로 Steve가 항상 선택됩니다. 그것은 -R임의의 종류 에 대한 무고한 오타로 보일 수 있습니다
Max

3
주석을 믿지 말고 코드를주의 깊게 읽으십시오.
TecBrat

16

루비

names = ["John", "Jeff", "Emma", "Steve", "Julie"]

puts names.sort{|x| rand()}.first

이것은 제대로 작동 sort_by하지만 sort과 같은 비교 함수를 기대합니다 <=>. rand ()의 결과는 항상 긍정적이므로 Ruby 구현의 sort알고리즘이 결정적 이라면 항상 동등한 결과를 생성합니다 . My Ruby 1.9.3은 항상 Julie를 출력합니다.


12

루비

names = ["John", "Jeff", "Emma", "Steve", "Julie"]

puts names[rand() % 5]

rand() 인수가 없으면 0과 1 사이의 임의의 부동 소수점이 생성됩니다. 따라서 모듈로 5는 아무 것도 수행하지 않으므로 float 인수가있는 배열로 분할 할 때 Ruby는 반올림하므로 항상 John을 반환합니다.


11

3 srands가 3 배 더 랜덤하게됩니다!

#!perl
use feature 'say';

sub random_person {
    my ($aref_people) = @_;
    srand; srand; srand;
    return $aref_people->[$RANDOM % scalar @$aref_people];
}

my @people = qw/John Jeff Emma Steve Julie/;
my $person = random_person(\@people);

say "$person makes next round of drinks!";

설명

perl에는 $ RANDOM이 없으며 정의되지 않은 변수입니다. 코드는 항상 목록에서 첫 번째 요소를 반환합니다-John의 음료 :)

편집하다:

코드를 살펴본 후 다섯 사람 중 하나가 명백한 오류를 수정하여 다음 프로그램을 생성하기로 결정했습니다.

#!perl
use feature 'say';

sub random_person {
    my ($aref_people) = @_;
    return $aref_people->[rand $#$aref_people];
}

my @people = qw/John Jeff Emma Steve Julie/;
my $person = random_person(\@people);

say "$person buys next round of drinks!";

코드를 보면서 누가 그랬는지 알 수 있습니까?

설명:

Perl에서 $#array마지막 요소의 색인을 리턴합니다. 배열은 제로되어 있기 때문에, 다섯 개 요소 어레이에 대한 참조가 주어진 $#$aref_people것이다 4.
rand는 0보다 크거나 같은 임의의 숫자를 매개 변수보다 작게 반환하므로 결코 반환하지 않습니다. 4즉, Julie는 절대 음료를 구매하지 않습니다.


1
$RANDOMbash, ksh 및 zsh의 실제 기능입니다 (perl은 아님).
kernigh 2016 년

10

파이썬

그런 작은 표본 공간에서는 무작위성을 신뢰할 수 없다는 것을 모두 알고 있습니다. 실제로 무작위로 만들기 위해 목록에서 이름을 선택하는 오래된 방법을 포기했으며 대신 내 프로그램에서 완전히 임의의 이름을 표시합니다. 사무실에있는 대부분의 이름은 4 글자로되어 있기 때문에 해결하겠습니다.

import random

def CHR (n):
    # Just easily convert a number between 0 and 25 into a corresponding letter
    return chr(n+ord('A'))

# Seed the RNG with a large prime number. And multiply it by 2 for good measure.
random.seed (86117*2)

# Now, let's see what COMPLETELY RANDOM name will be spelled out!
totallyRandomName = ''
for i in range(4) :
    totallyRandomName += CHR(int(random.random()*26))

print (totallyRandomName)

당연히 올바른 씨앗을 고르기 위해 준비 작업을했습니다.


15
상수로 생성 된 난수를 시드하는 것은 너무 분명합니다.
Brendan Long

@BrendanLong 확실히 눈썹을 올릴 것입니다. 사람들은 무작위로 테스트하기를 원할 것입니다. 그렇지 않은 경우 누가 음료를 구매하는지 추측하십시오.
JFA

10

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
char *name[]={"John", "Jeff", "Emma", "Steeve", "Julie"};

int i;
int n=rand()%10000;
int r=3;

for (i=0; i<10000+n; i++) // random number of iteration
    {
    r=(r*r)%10000; // my own PRNG (square and mod)
    }

printf("%s", name[r%5] );
}

미안, 제프!

수학 때문에 몇 번의 반복 후에 r == 1 mod 5입니다. 도덕성 : 수학에 나쁘다면 자신의 PRNG를 쓰지 마십시오. :)


10

C ++ x11

#include <vector>
#include <iostream>

int main () {
  std::srand(time(NULL));
  std::vector<std::string> choice{("jen","moss","roy")};
  std::cout << choice[rand()%choice.size()] << std::endl;
}

이니셜 라이저 목록에 사용 된 괄호로 인해 벡터 크기는 실제로 1입니다. 쉼표 연산자는 모든 이름을 버리고 마지막 이름을 반환하므로 구매자는 항상 Roy입니다.


10

스칼라

내 사용자가 회의적이라는 것을 알고 있으므로 내 임의성이 진정으로 공정하다는 증거를 포함 시켰습니다!

object DrinkChooser {

  def main(args: Array[String]): Unit = {
    proveRandomness()
    val names = List("John","Jeff","Emma","Steve","Julie")
    val buyer = names(randomChoice(names.size))
    println(s"$buyer will buy the drinks this time!")
  }

  def proveRandomness(): Unit = {
    val trials = 10000
    val n = 4
    val choices = for (_ <- 1 to 10000) yield randomChoice(n)
    (choices groupBy(identity)).toList.sortBy(_._1) foreach { case (a, x) =>
      println(a + " chosen " + (x.size * 100.0 / trials) + "%")
    }
  }

  def randomChoice(n: Int): Int = {
    var x = 1
    for (i <- 1 to 1000) { // don't trust random, add in more randomness!
      x = (x * randomInt(1, n)) % (n + 1)
    }
    x
  }

  // random int between min and max inclusive
  def randomInt(min: Int, max: Int) = {
    new scala.util.Random().nextInt(max - min + 1) + min
  }

}

한 가지 예는 다음과 같습니다.

1 chosen 25.31%
2 chosen 24.46%
3 chosen 24.83%
4 chosen 25.4%
John will buy the drinks this time!

다른 사람이 운이 좋으면 John은 항상 음료를 구입합니다.

무작위성의 "증거"는 rand(1, 4) * rand(1, 4) % 51과 4 사이에 여전히 고르게 분포되어 있다는 사실에 의존 합니다. 그러나 rand(1, 5) * rand(1, 5) % 6퇴보하다. 0을 얻을 가능성이 있으며 나머지 "임의성"에 관계없이 최종 결과를 0으로 만듭니다.



9

자바 스크립트

두 번째 시도는 조금 까다 롭습니다.

var getRandomEntry = function(args){
    return args[Math.floor(Math.random() * arguments.length)]; 
}

alert(getRandomEntry(["peter","julie","samantha","eddie","mark"]));

arguments변수 함수에 대한 로컬 액세스 및 함수에 전달 된 모든 인수의 배열이다. 간단한 이름 지정을 사용하고 배열을 함수 자체에 전달하면 배열의 길이를 사용하지 않고 실제로 인수 목록의 길이 (1)를 스푸핑 할 수 있습니다. 특수 문자 또는 글꼴 유형을 사용하면 더 잘 실행할 수 있습니다.


이것은 발견하기 가장 어렵지 않았습니다. NJavaScript에서 임의의 -ary 함수를 구성한 사람은 arguments변수 에 대해 알고 있습니다.
Conor O'Brien

8

C ++

공정하게하기 위해 우리는 많은 시련을 겪고 가장 많이 선택된 사람을 선택해야합니다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <map>

static const char *names[] = { "John", "Jeff", "Emma", "Steve", "Julie" };

int main() {
    srand(time(NULL));
    std::map<int, int> counts;

    // run 2^31 trials to ensure we eliminate any biases in rand()
    for (int i = 0; i < (1<<31); i++) {
        counts[rand() % (sizeof(names)/sizeof(*names))]++;
    }

    // pick the winner by whomever has the most random votes
    int winner = 0;
    for (std::map<int, int>::const_iterator iter = counts.begin(); iter != counts.end(); ++iter) {
        if (iter->second > counts[winner]) {
            winner = iter->first;
        }
    }

    printf("%s\n", names[winner % (sizeof(names)/sizeof(*names))]);
}

의 가치는 1<<31무엇입니까? 미안, 존


스포일러 질문에 대한 답변은 UB입니다. 그것이 더 좋거나 나쁘면 나는 미정입니다.
nwp

@nwp 글쎄,하지만 int가 32 비트 2의 보수이며 어디에서나 64 비트 (gcc 포함)에서도 마찬가지입니다. 그래도 Clang에서는 테스트하지 않았습니다.
솜털 같은

int가 32- 그러나 2의 보수 인 곳은 없습니다. 1 << 31의 값은 정의되어 있지 않습니다. 불행히도 정의되지 않은 동작으로 인해 컴파일러는 원하는 느낌을 선택하고 속도를 위해 만들어지기 때문에 아무것도하지 않기로 결정하므로 원하는대로됩니다.
nwp

@nwp에 1<<31 == 0x80000000대한 정의 <<와 32 비트 2의 보수에 따르면 INT_MIN. 어쩌면 1<<32어느 쪽을 생각하고 == 0있습니까? (x86부터, 1<<32보통 1로 평가됩니다.)
솜털 같은

@nwp 실제로 구현 정의입니다. 우리가 C에 대해 얘기했다 지금, 만약 다음 은 정의되지 않은 것입니다.
스튜어트 올슨

7

T-SQL (2008+)

SELECT TOP 1 name
FROM
 (VALUES('John'),('Jeff'),('Emma'),('Steve'),('Julie')) tbl(name)
ORDER BY RAND()

설명:

MS SQL Server에서는 RAND()실행 당 한 번만 평가됩니다. 모든 이름에는 항상 동일한 번호가 할당되어 원래 순서대로 유지됩니다. 존이 먼저입니다. 존을 위해 짜증.

제안 된 개선 :

T-SQL은을 사용하여 적절한 품질의 행당 난수를 생성 할 수 있습니다 RAND(CHECKSUM(NEWID())).


ORDER BY NEWID ()가 충분하다고 생각합니다 (CHECKSUM 필요 없음)
Jacob

7

루아

buyer={'John', 'Jeff', 'Emma', 'Steve', 'Julie'}
   -- use clock to set random seed
math.randomseed(os.clock())
   -- pick a random number between 1 and 5
i=math.random(5)
io.write("Today's buyer is ",buyer[i],".\n")

os.clock()타이밍 목적으로, 좋은 RNG os.time()와 함께 사용해야 math.randomseed합니다. 슬프게도 Julie는 항상 (적어도 내 컴퓨터에서) 구입합니다.


math.random()인수가 없으면 범위 내의 숫자도 반환합니다 [0,1). 그것을 잡지 않기 위해 -1.
mniip

@ mniip : 정말 자격이 있습니다! 지금 고쳤습니다.
Kyle Kanos

6

관용적 C ++ 11

음료가 포함 된 경우 최신 표준 및 코딩 스타일을 최신 상태로 유지하는 것이 특히 중요합니다. 이것은 매우 효율적이고 숙어를 준수하는 C ++ 11 이름 선택기의 훌륭한 예입니다.

시스템 클럭에서 시드되며 매번 확인을 위해 이름과 함께 시드를 출력합니다.

#include <vector>
#include <chrono>
#include <random>
#include <iostream>

auto main()->int {
  std::vector<std::string> names;           // storage for the names
  names.reserve(5);                         // always reserve ahead, for top performance
  names.emplace_back("John");               // emplace instead of push to avoid copies
  names.emplace_back("Jeff");
  names.emplace_back("Emma");
  names.emplace_back("Steve");
  names.emplace_back("Julie");

  std::mt19937_64 engine;                   // make sure we use a high quality RNG engine
  auto seed((engine, std::chrono::system_clock::now().time_since_epoch().count()));  // seed from clock
  std::uniform_int_distribution<unsigned> dist(0, names.size() - 1);     // distribute linearly
  auto number(dist(engine));                // pick a number corresponding to a name
  std::string name(names.at(number));       // look up the name by number
  std::cout << "Seed: " << seed << ", name: " << name << std::endl;  // output the name & seed
  return EXIT_SUCCESS;                      // don't forget to exit politely
}

이 라이브를보십시오 : http://ideone.com/KOet5H

좋습니다. 이것은 실제로 전체적으로 꽤 좋은 코드입니다. 거기에 당신이 명백한 통지 코드에 너무 밀접하게 보이게 붉은 청어를 많이합니다 - RNG 실제로이 사건에서 :) 시드되지 않습니다 것을 seed그냥 정수는, 그것은처럼 보이는 동안 engineA와 매개 변수로 전달 파종 기능은 실제로 무시됩니다. 시드 변수는 실제로 시계에서 설정되므로 부상과 모욕을 더하기 위해 이름과 함께 끝에 출력 될 수 있지만 항상 음료를 사는 스티브입니다.


1
이름에 이니셜 라이저 목록을 사용하지 않는다고 생각합니다. 적어도, 당신은 확실히 단지 코드 제공에 성공했습니다 느낌이 과다 설계를. 나는 그것이 "규정 준수"인지 아니면 모든 소음 설명 때문인지 알 수 없다. : P
vmrob

6

자바 스크립트

console.log(["Jeff", "Emma", "Steve", "Julie"][Math.floor(Math.random(5))]);

죄송합니다 Math.random. 매개 변수를 사용하지 않으며 항상 [0, 1)에서 숫자를 반환합니다. 그럼에도 불구하고, 그것은 행복한 변덕 스러운 기능 이며 논쟁에 대해 불평하지 않습니다!


5

파이썬

names=["John", "Jeff", "Emma", "Steve", "Julie"]
import random # Import random module
random.seed(str(random)) # Choose strictly random seed
print(random.choice(names)) # Print random choice

str (random)은 상수 문자열을 제공합니다. 임의의 값이 아님


6
다소 관련이없는 참고 사항 : Python 3.2 이상을 사용하는 경우 두 번째 인수 는 기본값 random.seed()이어야합니다 2. 당신이 전달하는 경우 version=1hash()문자열은 씨앗 대신 전체 문자열로 사용되며, 파이썬 무작위로 씨앗 문자열 '해시 값이 3.2에서 시작하기 때문에, 당신은 실제로-임의의 이름을 얻을 것이다.
Blacklight Shining

5

엠마는 그녀의 지갑을 잊지 않는 것이 좋습니다! strict및에서 실행됩니다 warnings.

use strict;
use warnings;

# Use a hash to store names since they're more extendible

my %people;
$people{$_}++ for qw/John Jeff Emma Steve Julie/;

print +(@_=%people)[rand@_];  # 'cos (keys %people)[rand( keys %people )]
                              # is just too long-winded.

여기에 설명 하십시오 .


Perl 5.18은 해시 키 난 수화 (해시 충돌 복잡성 공격을 피하기 위해)를 도입하여이 부분을 약간 변경했습니다.
Konrad Borowski 2019 년

4

자바 스크립트

function getDrinksBuyer(){ 
    var people = ["Jeff", "Emma", "Steve", "Julie"];
    var rand = Math.random(0,4)|0;
    return people[rand];
}

|0는 다른 라운딩을하는 것처럼 0 모든 시간의 결과 만 보인다.


나는 그것을 좋아한다. 내가 parseInt(Math.random(0, 4))하고 아마도 같은 주석을 추가하지만- Math.random이중을 반환하므로 먼저 정수로 변환하십시오
Claudiu

5
그 트릭은 실제로 Math.random빈약 한 매개 변수에는 아무런 영향을 미치지 않습니다. 그것은 자신의 방식으로 숫자를 선택합니다. 는 |0예기치 않은 결과를 올바르게 반올림하므로 속임수가 아닙니다.
Keen

|0(우리 모두에게 가장 가능성이있는) 사람들에게는 매우 분명하지만, 그것이 무엇인지 전혀 모르는 사람이 많이있을 것입니다. 그것이 내가 속이는 그룹이었습니다.
매트

3
@ 매트가 나는 것을 의미 |0당신이 무엇을 알고 있다면, 그것은 아래로 반올림, 그리고 그것처럼 보이는 됩니다 내림, 그래서기만이 아니다. (사람이 무엇을 아무 생각이없는 경우 그리고 |0수행을하고기만적인 코드에 대한 아무 소용 없다,. 당신은 당신이 그들을 믿고 싶어 무엇을 말할 수) 대신에, 당신의 대답에서 예기치 않은 동작이 사실에 기초 Math.random(0,4)기능적으로 동일합니다 Math.random(), Math.random매개 변수를 사용하지 않기 때문 입니다.
Keen

4

제이

;(?.5) { 'John'; 'Jeff'; 'Emma'; 'Steve'; 'Julie'

불쌍한 줄리 ... 퀴즈 : 이것은 내가 작성한 것 중 가장 깨끗한 J일지도 모른다.

이 코드는 실제로 한 가지를 제외하고는 정확합니다. ?.균일 한 rng : ?.5항상 4를 반환 ?5합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.