# 2의 랜덤 골프 : 정규 분포의 숫자


12

시리즈 정보

우선, 이것을 다른 코드 골프 도전과 같이 취급하고 시리즈에 대해 전혀 걱정하지 않고 대답 할 수 있습니다. 그러나 모든 과제에는 리더 보드가 있습니다. 첫 번째 게시물에서 시리즈 대한 추가 정보와 함께 리더 보드를 찾을 수 있습니다 .

시리즈에 대한 아이디어가 많이 있지만 미래의 과제는 아직 해결되지 않았습니다. 제안 사항이 있으면 관련 샌드 박스 게시물에 알려주십시오 .

구멍 2 : 정규 분포의 숫자

아직 완료되지 않았다는 것을 믿을 수 없습니다! 정규 분포 를 사용하여 난수를 생성해야 합니다. 일부 규칙 (대부분의 규칙은 대부분의 제출에서 자동으로 다루어 지지만 일부 규칙은 크게 다른 언어 간의 결과 일관성을 보장하기 위해 적용됩니다) :

  • 입력 으로 시드 SN반환 할 숫자 의 양 이 아닌 음수가 아닌 두 정수를 입력 해야합니다 . 출력은 평균이 0 이고 분산이 1 인N 정규 분포에서 가져온 부동 소수점 숫자 의 목록이어야합니다 . 제출물에 동일한 시드가 부여 될 때마다 동일한 수를 생성해야합니다. 특히와 함께 한 번 호출되고 와 함께 한 번 호출 되는 경우 두 출력 의 첫 번째 항목이 동일해야합니다. 또한, 적어도 2 개의 16 개의 서로 다른 값이 다른 시퀀스를 생성해야합니다.S(S, N1)(S, N2)min(N1, N2)S

  • 전달할 수 있고 적어도 2 개의 16 개의 다른 시드를 지원하는 경우 대략적인 균일 분포 에서 숫자를 추출하도록 문서화 된 내장 난수 생성기를 사용할 수 있습니다 . 그렇게 하면 RNG는 요청한 번호에 대해 적어도 2 개의 20 개의 다른 값 을 반환 할 수 있어야 합니다.S

  • 사용 가능한 균일 한 RNG의 범위가 더 작거나 시드 할 수 없거나 너무 적은 시드를 지원하는 경우 먼저 내장 된 것 위에 충분히 넓은 범위의 균일 한 RNG를 구축하거나 다음을 사용하여 적절한 RNG 를 구현해야합니다. 씨앗. 이 페이지 가 도움 될 수 있습니다.
  • 정규 분포를 생성하기 위해 확립 된 알고리즘을 구현하지 않은 경우 정확성을 증명하십시오. 두 경우 모두, 선택한 알고리즘은 이론적으로 정확한 정규 분포 (기본 PRNG 또는 제한 정밀도 데이터 유형의 제한을 제외 함)를 산출해야합니다 .
  • 구현시 부동 소수점 숫자 (최소 32 비트 폭) 또는 고정 소수점 숫자 (최소 24 비트 폭)를 사용하고 반환해야 하며 모든 산술 연산은 선택한 유형의 전체 너비를 사용해야합니다.
  • 오차 함수 또는 역함수 와 같은 정규 분포 또는 가우스 적분과 직접 관련된 내장 함수를 사용해서는 안됩니다 .

전체 프로그램 또는 함수를 작성하고 STDIN, 명령 행 인수, 함수 인수 또는 프롬프트를 통해 입력을 가져오고 리턴 값을 통해 또는 STDOUT (또는 가장 가까운 대안)으로 인쇄하여 출력을 생성 할 수 있습니다.

SN음이 아닌 정수, 각각 2 미만이어야한다 (20) . 출력은 편리하고 명확한 목록 또는 문자열 형식 일 수 있습니다.

이것은 코드 골프이므로 가장 짧은 제출 (바이트)이 이깁니다. 물론 사용자 당 가장 짧은 제출물도 시리즈의 전체 순위표에 들어갑니다.

리더 보드

시리즈의 첫 번째 게시물은 리더 보드를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 모든 답변을 헤드 라인으로 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

(언어는 현재 표시되어 있지 않지만 스 니펫은이를 요구하고 구문 분석하며 향후 언어 별 리더 보드를 추가 할 수 있습니다.)


잠깐, 우리는 정수가 아닌 RNG를 사용할 수 있습니까?
nini

PS 2 기존 답변은 [0, 1) 부동 소수점 RNG를 사용하는 것 같습니다. 허용됩니까?
nini

@mniip 예, 부동 소수점 RNG는 균일하고 시드 가능하며 필요한 수의 고유 한 부동 소수점을 반환 할 수있는 경우 허용됩니다.
Martin Ender

답변:


8

Dyalog APL, 33 바이트

{(.5*⍨¯2×⍟?0)×1○○2×?0}¨⍳⎕⊣⎕rl←1+⎕

박스 뮬러 :

⎕         ⍝ evaluated input
⎕rl←1+⎕   ⍝ set APL's random seed to 1+⎕ (S)
          ⍝   add 1 because ⎕rl←0 has special meaning: sets the seed randomly
{ }¨⍳N    ⍝ do the thing in braces N times
?0        ⍝ random number 0≤x<1
1○○2×A    ⍝ sin(2πA)
.5*⍨¯2×⍟B ⍝ sqrt(-2lnB)

나는 이것이 다른 언어로 이길 수 없다고 확신합니다.
Zero Fiber

2
"특히 (S, N1)로 한 번 호출되고 (S, N2)로 한 번 호출되면 두 출력의 첫 번째 min (N1, N2) 항목이 동일해야합니다."
marinus

@marinus 감사합니다. 또한 특별한 의미 ⎕rlS+1있기 때문에로 변경되었습니다 ⎕rl←0.
ngn

실제로는 필요하지 않습니다 +1. 적어도 2 ^ 16 개의 다른 값을 지원해야한다는 것입니다. 따라서 [1..2 ^ 16] 범위에서 올바르게 작동하는 것이 좋습니다.
marinus

S = 0은 계산을 반복 할 수 없게하므로 위에서 인용 한 규칙에 위배됩니다.
ngn

8

R, 68 바이트

function(S,N){set.seed(S);sqrt(-2*log(runif(N)))*cos(2*pi*runif(N))}

이는 runif()균일 분포에서 랜덤 이탈을 생성 하는 함수를 사용합니다 . 난수 생성의 시드는 set.seed()기본적으로 2 ^ 19937-1의 주기로 Mersenne-Twister 알고리즘을 사용하는을 사용하여 지정됩니다 .

결과는 계산 된 표준 법선 편차를 포함하는 길이 N의 R 벡터입니다.

이것은 Box-Muller 방법을 사용합니다. 두 개의 독립적 인 균일 랜덤 변수 U와 V의 경우, 여기에 이미지 설명을 입력하십시오


그것이 R에서 유효한 구문이라면, (당신이 f=당신의 언어로 명명되지 않은 함수라면, 함수는 반드시 명명 될 필요는 없습니다) 생략 할 수 있습니다 .
Martin Ender 2019

@ MartinBüttner : 제안에 감사하지만 R은 이름없는 함수로 무엇을 해야할지 알지 못합니다.
Alex A.

난 항상 오류 메시지 Error: unexpected '}' in "f=fu...게다가, 당신은 확실히 당신이 얻을 수있는 동일한 전화 할 경우 첫 번째 숫자 f(0,1)f(0,2)?
flawr

4

Dyalog APL, 42 34

{⎕RL←⍺⋄{(.5*⍨¯2×⍟⍺)×1○⍵×○2}/?⍵2⍴0}

이것은 S왼쪽 인수와 N오른쪽 인수로 사용되는 함수입니다.

     5{⎕RL←⍺⋄{(.5*⍨¯2×⍟⍺)×1○⍵×○2}/?⍵2⍴0}10
3.019132549 ¯0.2903143175 ¯0.7353414637 1.421417015 2.327544764 ¯0.00005019747711 ¯0.9582127248 ¯0.2764568462
      ¯0.1602736853 ¯0.9912352616
     5{⎕RL←⍺⋄{(.5*⍨¯2×⍟⍺)×1○⍵×○2}/?⍵2⍴0}20
3.019132549 ¯0.2903143175 ¯0.7353414637 1.421417015 2.327544764 ¯0.00005019747711 ¯0.9582127248 ¯0.2764568462
      ¯0.1602736853 ¯0.9912352616 0.642585109 ¯0.2450019151 ¯0.415034463 0.03481768503 ¯0.4621212815 ¯0.760925979
      0.2592913013 1.884867889 ¯0.9621252731 0.3062560446

Dyalog APL의 내장 임의 연산자를 사용하여 Box-Muller 변환을 구현 ?한 것으로, 기본적으로 64 비트 값을 반환하는 Mersenne 트위스터로 충분합니다.

설명:

  • ⎕RL←⍺: 임의 시드를로 설정하십시오 .
  • ?⍵2⍴0: 0과 1 사이의 난수 쌍을 생성 합니다.
  • {... }/: 각 쌍에 다음 기능을 적용합니다.
    • (.5*⍨¯2×⍟⍺)×1○⍵×○2: Z0값을 계산합니다 ( sqrt(-2 ln ⍺)×cos(2π⍵)).

1
v14.0에서는 ?00과 1 사이의 부동 소수점 숫자를 반환합니다.
ngn

3

펄, 67

sub f{srand$_[0];map{cos(atan2(1,1)*rand 8)*sqrt-2*log rand}1..pop}

다른 항목과 마찬가지로 Box-Muller f매개 변수를 순서대로 가져옵니다 S, N.

사용하다:

$ perl -le 'sub f{srand$_[0];map{cos(atan2(1,1)*rand 8)*sqrt-2*log rand}1..pop}print for f(5,3)'
-1.59212831801942
0.432167710756345
-0.533673305924252

3

자바, 164161 바이트

class B extends java.util.Random{B(int s,int n){super(s);for(;n-->0;System.out.println(Math.sqrt(-2*Math.log(nextDouble()))*Math.cos(2*Math.PI*nextDouble())));}}

이것은 기능을 통한 입력과 stdout을 통한 출력을받습니다. Box-Muller 방법을 사용합니다.


5
s=0;s++<n;-> ;n-->0;?
Geobits

1
@Geobits 람다처럼 보인다 : D
TheNumberOne

3

코모도어 64 베이직, 76 70 63 바이트

1INPUTS,N:S=R/(-S):F┌I=1TON:?S●(-2*LOG(R/(1)))*S╮(2*π*R/(1)):N─

PETSCII 문자 세트에는 유니 코드에없는 일부 기호가 포함되어 있기 때문에 대체했습니다 : /= SHIFT+N, = SHIFT+O, = SHIFT+Q, = SHIFT+I, =SHIFT+E

이것은 표준 Box-Muller 변환을 구현하여 숫자를 생성합니다. Commodore 64 Basic에는에 대한 두 문자 바로 가기가 sin()있지만에 대한 것이 아니기 때문에 변환의 sin (x) 절반을 선택 했습니다 cos().

매뉴얼에 달리 명시되어 있지만 인수 값 RND 중요합니다. 음수가 전달되면 난수 생성기가 다시 시드되지 않고 해당 숫자로 다시 시드 됩니다 . 이렇게하면 시드가 훨씬 간단 해집니다 POKE.5 개의 메모리 위치가 필요하지 않고을 호출 RND하면됩니다.이 코드는 두 줄 / 121 바이트에서 1 줄 / 76 바이트로 줄입니다.

편집 : 두 INPUT문장을 결합 할 수 있고 그 이후의 공간 TO은 선택 사항 이라는 것을 깨닫고 6 바이트를 골랐습니다 .

편집 : 또 다른 7 가지 골프 : Commodore Basic은 실제로 Pi를 내장 상수로 사용하며 현대 키보드에서도 입력 SHIFT+PgDn할 수 있습니다 (궁금한 경우).


3

80386 머신 코드, 72 바이트

코드의 16 진 덤프 :

60 8b 7c 24 24 33 ed 8d 75 fb 8d 46 79 f7 e2 f7
f6 8b da b3 7f 0f cb d1 eb 89 1f d9 07 d9 e8 de
e9 33 ee 75 e5 d9 ed d9 c9 d9 f1 dc c0 d9 e0 d9
fa d9 c9 d9 eb de c9 dc c0 d9 ff de c9 d9 1f 83
c7 04 e2 c6 61 c2 04 00

소스 코드는 다음과 같습니다 (Visual Studio에서 컴파일 할 수 있음).

__declspec(naked) void __fastcall doit(int count, unsigned seed, float* output)
{
    _asm {
                                // ecx = count
                                // edx = seed
        // save registers
        pushad;
        mov edi, [esp + 0x24];  // edi = pointer to output
        xor ebp, ebp;           // ebp = 0
        lea esi, [ebp - 5];     // esi = 4294967291 (a prime number)

    myloop:
        // Calculate the next random number
        lea eax, [esi + 121];   // eax = 116
        mul edx;
        div esi;
        mov ebx, edx;

        // Convert it to a float in the range 1...2
        mov bl, 0x7f;
        bswap ebx;
        shr ebx, 1;

        // Convert to range 0...1 and push onto the FPU stack
        mov [edi], ebx;
        fld dword ptr [edi];
        fld1;
        fsubp st(1), st;

        // Make 2 such random numbers
        xor ebp, esi;
        jnz myloop;

        // Calculate sqrt(-2*ln(x))
        fldln2;
        fxch;
        fyl2x;
        fadd st, st(0);
        fchs;
        fsqrt;

        // Calculate cos(2*pi*y)
        fxch st(1);
        fldpi;
        fmul;
        fadd st, st(0);
        fcos;

        // Calculate and write output
        fmulp st(1), st;
        fstp dword ptr [edi];
        add edi, 4;

        // Repeat
        loop myloop

        // Return
        popad;
        ret 4;
    }
}

여기서는 Lehmer 난수 생성기를 사용 합니다. 다음 알고리즘을 사용합니다.

x(k+1) = 116 * x(k) mod 4294967291

여기에서 4294967291은 큰 (2 ^ 32-5) 소수이며 116은 기본 루트 인 작은 (128 미만, 아래 참조) 숫자입니다 . 나는 이진 표현 (01110100)에서 0과 1의 다소 랜덤 분포를 갖는 원시 루트를 선택했습니다. 시드가 0이 아닌 경우이 RNG의 최대 가능 기간은 4294967290입니다.


여기에서 사용한 비교적 작은 숫자 (116 및 4294967291, -5로 표시 될 수 있음)를 사용하여 lea명령어 인코딩 을 활용할 수 있습니다 .

8d 46 79     lea eax, [esi+121]

숫자가 1 바이트에 들어갈 수 있으면 3 바이트로 어셈블됩니다.


곱셈과 나눗셈 사용 edx하고 eax난 이루어진다 왜 그들의 작업 레지스터로서 seed기능을 두번째 파라미터 ( fastcall컨벤션 용도를 호출하는 edx두 번째 매개 변수를 전달한다). 또한 첫 번째 매개 변수가 전달되어 ecx카운터를 보유하기에 좋은 장소입니다. 루프는 하나의 명령으로 구성 할 수 있습니다!

e2 c6        loop myloop

정수를 부동 소수점 숫자로 변환하기 위해 단 정밀도 부동 소수점 숫자의 표현을 악용했습니다. 높은 9 비트 (지수)를 비트 패턴 001111111으로 설정하고 23 개의 낮은 비트를 무작위로두면 1 ... 2 범위의 난수를 구하십시오. 나는 여기서 아이디어를 취했다 . 높은 9 비트를 설정하기 위해 비트 인증을 사용했습니다 ebx.

mov ebx, edx;    xxxxxxxx|yyyyyyyy|zzzzzzzz|aaaaaaaa
mov bl, 0x7f;    xxxxxxxx|yyyyyyyy|zzzzzzzz|01111111
bswap ebx;       01111111|zzzzzzzz|yyyyyyyy|xxxxxxxx
shr ebx, 1;      00111111|1zzzzzzz|zyyyyyyy|yxxxxxxx

두 개의 난수를 생성하기 위해 중첩 루프를 2 회 반복했습니다. 나는 그것을 구성했다 xor:

xor ebp, esi;    first time, the result is -5
jnz myloop;      second time, the result is 0 - exit loop

부동 소수점 코드는 Box-Muller 변환을 구현합니다 .


2

하스켈,  118144 

import System.Random;h z=let(u,r)=random z in(cos$2*pi*fst(random r)::Float)*sqrt(-2*log u):h r;g=(.(h.mkStdGen)).take

사용법 예 :

*Main> g 3 0x6AE4A92CAFA8A742
[0.50378895,-0.20593005,-0.16684927]
*Main> g 6 0x6AE4A92CAFA8A742
[0.50378895,-0.20593005,-0.16684927,1.1229043,-0.10026576,0.4279402]
*Main> g 6 0xE09B1088DF461F7D
[2.5723906,-0.5177805,-1.3535261,0.7400385,3.5619608e-3,-8.246434e-2]

상기의 복귀 형 random으로 제한되는 Float차종이 random[0, 1)의 균일 한 유동을 생성한다. 그때부터 그것은 목록 생성을위한 무의미한 마술이있는 단순한 상자 뮬러 공식입니다.


2

골프 루아, 63 70

Golflua 정보 및 지침.

\g(n,s)`_ENV,b=M,{}rs(s)~@i=1,n b[i]=q(l(r()^-2))*c(r()*pi)$~b$

값이 포함 된 테이블을 반환합니다. 이 예에서는 루아 ~T.u( )와 동일한을 사용 return table.unpack( )하고 있습니다.

> ~T.u(g(3,1234567))
0.89302672974232 0.36330401643578 -0.64762161593981
> ~T.u(g(5,1234567))
0.89302672974232 0.36330401643578 -0.64762161593981 -0.70654636393063 -0.65662878785425
> ~T.u(g(5,7654321))
0.3867923683064 -0.31758512485963 -0.58059120409317 1.2079459300077 1.1500121921242

함수 환경을 M(aka math) 로 설정하여 많은 문자를 저장했습니다 .


2

SAS, 108

이미 R 보다 짧은 답변을 게시 했지만 PPCG에는 SAS 답변이 거의 없으므로 다른 답변을 추가하지 않는 이유는 무엇입니까?

%macro f(s,n);data;do i=1 to &n;x=sqrt(-2*log(ranuni(&s)))*cos(8*atan2(1,1)*ranuni(&s));put x;end;run;%mend;

공백이있는 경우 :

%macro f(s, n);
    data;
        do i = 1 to &n;
            x = sqrt(-2 * log(ranuni(&s))) * cos(8 * atan2(1, 1) * ranuni(&s));
            put x;
        end;
    run;
%mend;

이것은처럼 호출 될 수있는 매크로를 정의합니다 %f(5, 3). 이 매크로는 정수 1에서 N까지 반복되는 데이터 단계를 실행하고 각 반복에서 Box-Muller를 사용하여 임의의 정규 편차를 계산하고 put명령문을 사용하여 로그에 인쇄합니다 .

SAS에는 pi에 대한 기본 제공 기능이 없으므로 arctangent를 사용하여 근사화하는 것이 가장 좋습니다.

ranuni()함수 (더 이상 사용되지 않지만 최신 함수보다 몇 자 적은 문자가 필요함)는 균일 분포에서 난수를 반환합니다. SAS 문서는 2 ^ 31-2 기간 이외의 RNG 구현에 대한 자세한 정보를 제공하지 않습니다.

SAS 매크로에서 매크로 변수는 선행으로 참조 &되고 런타임시 해당 값으로 해석됩니다.

아마 목격했듯이 SAS는 대회 에서 실제로 경쟁자가되는 경우는 거의 없습니다 .


2

자바, 193 바이트

이것이 현재 Java 리더를 능가하지는 않지만 어쨌든 다른 계산 방법을 보여주기 위해 게시하기로 결정했습니다. OpenJDK의 골프 버전입니다 nextGaussian().

class N extends java.util.Random{N(int s,int n){super(s);for(float a,v;n-->0;System.out.println(v*Math.sqrt(-2*Math.log(a)/a)))for(a=0;a>=1|a==0;a=v*v+(v=2*nextFloat()-1)*v)v=2*nextFloat()-1;}}

줄 바꿈으로 :

class N extends java.util.Random{
    N(int s,int n){
        super(s);
        for(float a,v;
            n-->0;
            System.out.println(v*Math.sqrt(-2*Math.log(a)/a)))
                for(a=0;
                    a>=1|a==0;
                    a=v*v+(v=2*nextFloat()-1)*v)v=2*nextFloat()-1;
    }
}

2
Marsaglia를 사용하는 하나 (또는 오히려 솔직 박스 뮬러 사용하지 않는 경우))
마틴 청산

람다가 될 수 없습니까? 뭔가 같은 :(s,n)->{java.util.Random r=new java.util.Random(s);for(float a,v;n-->0;System.out.println(v*Math.sqrt(-2*Math.log(a)/a)))for(a=0;a>=1|a==0;a=v*v+(v=2*r.nextFloat()-1)*v)v=2*r.nextFloat()-1;}
저스틴

2
@Quincunx 나는 1 바이트를 할 수 있었다. 그러나 메타에 대한 현재의 합의가 무엇이든 계산되지 않은 코드로 함수 선언을 숨기는 것을 좋아하지 않습니다. 그것은 나에게 1 바이트의 가치가있다;)
Geobits

2

T-SQL, 155 바이트

CREATE PROC R(@S BIGINT,@N INT)AS
DECLARE @ INT=0,@K INT=8388607WHILE @<@N
BEGIN
SELECT SQRT(-2*LOG(RAND(@S*@%@K)))*COS(2*PI()*RAND(@S*9*@%@K))SET @+=1
END

T-SQL에는 STD_IN이 없으므로 EXEC RS, N과 함께 사용하십시오. 여기서 S와 N은 각각 시드와 N입니다. S> 2 ^ 16 일 때 "랜덤"(RAND (seed)는 정말 나쁜 난수 구현) 시퀀스를 생성합니다 (이전에는 가능하지만 보장 할 수는 없습니다). 지금까지 대부분의 솔루션처럼 Box-Muller를 사용합니다. 8388607은 2 ^ 23-1이며 2 ^ 20 개의 다른 값을 생성해야합니다.


2

파워 쉘, 164 바이트

Param($s,$n)$q=2147483647
$a=GET-RANDOM -SETSEED $s
FOR(;$n---gt0;){$a=GET-RANDOM
$b=GET-RANDOM
[math]::SQRT(-2*[math]::LOG($a/$q))*[math]::COS(2*[math]::PI*$b/$q)}

Box-Muller의 대부분의 답변과 동일합니다. Powershell에 대한 경험이 많지 않으므로 골프에 도움이 될 것입니다.


2

루비, 72 바이트

->n,s{include Math;srand s;n.times{p sqrt(-2*log(rand))*sin(2*rand*PI)}}

입력 (람다 함수) :

f.(6, 12353405)

산출:

-1.1565142460805273
0.9352802655317097
1.3566720571574993
-0.9683973210257978
0.9851210877202192
0.14709635752306677

추신 :이 골프를 더 할 수 있는지 알고 싶습니다. 나는 단지 초보자입니다.


@ MartinBüttner 요즘 너무 많은 C를 사용하고 있다고 생각합니다. 완전히 잊었다.
Zero Fiber

2

MATLAB, 77

첫 번째 입력되어야 n, 두번째 s.

a=input('');
rand('seed',a(2));
for i=1:a;
    (-2*log(rand))^.5*cos(2*pi*rand)
end

2

옥타브, 91 96 88 바이트

function r=n(s,n)rand("seed",s);x=rand(2,n);r=cos(2*pi*x(1,:)).*sqrt(-2*log(x(2,:)));end

또는 공백이있는 경우 :

function r=n(s,n)
  rand("seed",s);
  x=rand(2,n);
  r=cos(2*pi*x(1,:)).*sqrt(-2*log(x(2,:)));
end

시드를 위로 세우고 Box-Mueller 방법을 사용하십시오.

NB : Octave를 사용하면 난수 배열을 생성 할 수 있으며 배열 출력을 생성하는 이러한 배열에서 표준 연산을 사용할 수 있습니다. .*오퍼레이터는 결과를 생성하기 위해 두 배열의 원소 별 곱셈이다.


당신이 호출하면 나는이 조건을 충족하지 않는 생각, n(0,1)그리고 n(0,2)당신이 다른 첫 번째 숫자를 얻을 당신은 무엇입니까?
flawr

크랩, 당신은 맞습니다. 나는 그것을
고치지 만

2

Pyth, 32 바이트

Pyth가 지금 가지고있는 새로운 기능으로 인해 현재 인용 부호 안에 파이썬이 사용되고 있지 않습니다. 또 다른 Box-Mueller.

 .xvzVQ*@_y.lOZ2.71 2.ty*3.14OZ1

처음에는 그 공간이 중요합니다.

.xvz             Seed RNG with evaluated input
VQ               For N in second input
*                Multiplication
 @       2       Square root
   _y            Times negative 2
    .l )         Natural log
     OZ          Of random float (RNG with zero give [0, 1) float)
 .t       1      Cosine from list of trig functions
  y              Double
   *             Multiplication
    .nZ          Pi from constants list
    OZ           Random Float

시딩은 온라인 인터프리터에서는 작동하지 않지만 로컬 버전에서는 제대로 작동합니다. 온라인 인터프리터는, 그래서 여기에 고정 될 것으로 보인다 퍼머입니다 : 퍼머


1
이것은 .nZ질문을 받았을 때 구현되지 않은 Pyth ( ) 의 기능을 사용합니다 . (실제로 오늘 구현되었습니다.) 따라서이 답변은 경쟁의 일부가되어서는 안됩니다 ( meta.codegolf.stackexchange.com/questions/4867/… ).
Jakube

K, 나는 32 문자 솔루션으로 돌아갈 것이다
Maltysen

그래, 나아질거야 답변의 별도 섹션에서 새 솔루션을 계속 보여줄 수 있습니다. 그러나 경쟁하는 코드는 이전 Pyth와 함께 작동하는 코드 여야합니다.
Jakube

1
Btw, 32 솔루션도 유효하다고 생각하지 않습니다. 약 5 일 전에 추가 된 무작위 시드 초기화를 사용하기 때문입니다.
Jakube

1

STATA, 85 바이트

di _r(s)_r(n)
set se $s
set ob $n
g a=sqrt(-2*ln(runiform()))*cos(2*runiform()*_pi)
l

표준 입력을 통해 입력을받습니다 (첫 번째 숫자는 S, N). 시드를 S로 설정합니다. 관측치 수를 N으로 설정합니다. 변수를 만들고 그 값을 Box Muller 변환 값으로 설정합니다 (표시하려면 @Alex 덕분). 그런 다음 열 머리글 a와 옆에 관측 번호가있는 테이블에 모든 관측치를 나열합니다. 이것들이 좋지 않으면 알려주세요. 헤더 및 / 또는 관찰 번호를 제거 할 수 있습니다.


1

R, 89 바이트

나는 R이 이전에 수행되었다는 것을 알고 있지만 다른 사람들이 사용했던 Box-Muller와는 다른 접근법을 보여주고 싶었습니다. 내 솔루션은 중앙 제한 정리를 사용합니다 .

f=function(S,N){set.seed(S);a=1000;for(i in(1:N)){print(sqrt(12/a)*(sum(runif(a))-a/2))}}

1
중심 한계 정리가 "선택한 알고리즘이 이론적으로 정확한 정규 분포를 산출해야합니다"를 만족시키지 않는 것이 두렵습니다. 더하기 균일 한 변수의 수에 관계없이 합이 유한 한 한 정규 분포는 항상 근사치입니다. (중심 극한 정리는 좋은 생각이지만이 사용되어야하는 값 분명하지 정확하게 때문에, 나는 그것을 배제했다 a결과가 "공정"가되도록 코드에서.)
마틴 청산

1
그것은 가치가 있었다;)
Michal

1

TI 기본, 74 바이트

Prompt S,N:S→rand:For(X,1,N:0→A:0→V:0→W:While A≥1 or A=0:2rand-1→V:2rand-1→W:V²+W²→A:End:Disp VW√(Aֿ¹-2log(A:End

1      1111111   11   1111111111111111111     1111   111111   1111111   11111111111111  11    111111111   111

¹실제로 역 연산자이다.


1

150 108 107 바이트

이것은 Marsaglia Polar Method를 사용합니다 . f (S, N)으로 호출됩니다.

의 할당 $a을의 계산으로 이동했습니다 $c.

107 :

sub f{srand$_[0];map{do{$c=($a=-1+2*rand)**2+(-1+2*rand)**2}until$c<1;print$a*sqrt(-2*log($c)/$c)}1..$_[1]}

예비 번호 저장 및의 정의가 제거되었습니다 $b.

108 :

sub f{srand$_[0];map{do{$a=-1+2*rand,$c=$a**2+(-1+2*rand)**2}until$c<1;print$a*sqrt(-2*log($c)/$c)}1..$_[1]}

150 :

sub f{srand$_[0];map{$h?$h=!print$s:do{do{$a=-1+2*rand,$b=-1+2*rand,$c=$a*$a+$b*$b}until$c<1;$d=sqrt(-2*log($c)/$c);$s=$b*$d;$h=print$a*$d;}}1..$_[1]}

1

스위프트 144 142

Swift가 어떻게 작동하는지 보는 것이 영리한 것은 아닙니다.

import Foundation;func r(s:UInt32,n:Int){srand(s);for i in 0..<n{println(sqrt(-2*log(Double(rand())/0xffffffff))*sin(2*Double(rand())*M_PI))}}

(0 ... n) .map {}을 사용할 수 있기를 바랐지만 매개 변수를 사용하지 않으면 컴파일러가 map {}을 인식하지 못하는 것 같습니다.


물론이야...? 그건forEach 당신이 반환 값을하지 않으려면, 나는 꽤 확인 해요 _ in의무
ASCII 전용

/0xffffffffbtw 는 무엇입니까
ASCII 전용



0

SmileBASIC, 81 바이트

글쎄, 이제 첫 번째 질문에 대답 했으므로 나머지는 모두해야합니다 ...

난수 생성은 저렴하지만 RNG를 시딩 하면 언어에서 가장 긴 내장 함수가 사용 됩니다 RANDOMIZE.

DEF N S,N
RANDOMIZE.,S
FOR I=1TO N?SQR(-2*LOG(RNDF()))*COS(PI()*2*RNDF())NEXT
END

수식을 최적화하는 방법이있을 수 있습니다. 두 개의 RNG 호출을 사용하는 방법을 모르겠습니다.


되는 박스 뮬러 변환에 두 개의 독립적 인 샘플을 가질 필요
ASCII 전용
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.