1 / N 확률


29

간단한 문제가 충분하지 않기 때문에 :

정수 1 ≤ N ≤ 10000을 지정하고 의사 난수 확률 1 / N으로 언어의 True 값을 출력하고 그렇지 않은 경우 False 인 선택적으로 명명되지 않은 프로그램 또는 함수를 만듭니다.

이름 지정 요구 사항이 제거되었습니다. 이에 따라 답변과 점수를 자유롭게 편집하십시오.

일부 언어는 True 및 False에 1 (또는 -1)과 0을 사용합니다.

예:

입력 테스트 예 :

4 -> True
4 -> False
4 -> False
4 -> False
4 -> False
4 -> True
4 -> False
4 -> False

즉, 4가 주어진다; 25 % 확률로 True를, 75 % 확률로 False를 반환합니다.




모든 언어가 "의사 무작위성"으로 구축 된 것은 아니므로 씨앗을 두 번째 인수로 얻을 수 있습니까? (예 : Brainfuck)
flawr

@flawr 현재 밀리 초 사용 ...
Adám

1
가장 큰 것은 무엇입니까 N?
Toby Speight

답변:


27

48 바이트의 ParserFunctions가 포함 된 MediaWiki 템플릿

{{#ifexpr:1>{{#time:U}} mod {{{n}}}|true|false}}

13
언어의 흥미로운 선택 :-)
Adám

6
미디어 위키 템플릿에 비 결정적 기능을 추가하는 것이 현명 할 것이라고 누가 생각 했습니까?
user253751

4
@immibis : 잘 비 결정론에서 발생 #time아마 사는 사람들의 나이 등을 업데이트 할
윌렘 반 Onsem

15

Pyth, 3 바이트

!OQ

온라인으로 사용해보십시오

0에서 입력으로 무작위 선택의 간단한 반전

Pyth에서는 Pyth $기능이 자동으로 메모되므로이 기능 을 수행하지 않으면 기능을 수행 할 수 없습니다 .



@LeakyNun 아, 임의의 함수에 시간을 사용하는 것을 잊어 버렸습니다.
FryAmTheEggman

아니요, 방금 메모리를 제거하는 데 시간을 사용했습니다.
Leaky Nun

1
나는 잘 말하지 않았다고 생각합니다. 시간을 인수로 취하는 것이 기본적으로 허용되는 것은 아닙니다.
FryAmTheEggman

1
@LeakyNun이 질문은 앞선 생각 Q, 말에서 충전을 달리 내가 대답했을 것이다 !O)
FryAmTheEggman

12

CJam, 5 바이트

이걸로 빨리 가야 해 ...

rimr!

여기에서 테스트하십시오.

설명

ri e# Read input and convert to integer N.
mr e# Get a uniformly random value in [0 1 ... N-1].
!  e# Logical NOT, turns 0 into 1 and everything else into 0.

11
" 이것들에 빠르다 ... "이것은 " 간단한 코드 골프 과제가 충분하지 않다 "는 OP에 동의하지 않는 이유 이다. FGITW가 문제인 경우 IMO는 너무 간단합니다.
피터 테일러

12

TI-BASIC, 1 바이트 토큰을 사용하는 4 바이트

not(int(Ansrand

입력의 정수 부분에 [0,1)의 난수가 0인지 여부를 결정합니다. Ansrand<1작동합니다.


어떻게 ... 4 바이트입니까?
John Dvorak

3
@JanDvorak 첫 바이트는 not (, 다음은 int (, 다음은 Ans, 다음은 rand)입니다. 일반적으로 그래프 계산기는 ASCII를 프로그램의 내부 표현으로 사용 하지 않습니다 .
user253751

@immibis 일반적으로 컴퓨터는 ASCII도 사용하지 않습니다. 이것은 의문의 여지가 있습니다. 메타 토론이 있습니까?
Kroltan

7
@Kroltan 예; 이것은 메타 토론이며, 이것은 1 바이트의 토큰 목록이며 여기에는 내가 사용한 4 개가 모두 포함됩니다.
lirtosiast

@ThomasKwa 감사합니다!
Kroltan

11

MATL, 5 바이트

이 버전의 세 가지 버전, 모두 길이 5.

iYr1=

입력 ( i) 을 취하여 1과 해당 숫자 ( Yr) 사이의 임의의 정수를 생성하고 1 ( 1=) 과 같은지 확인합니다 . 또는

li/r>

1 ( l, 1i순간에 버그가 있기 때문에 해결 방법 ), 입력 ( i), 1 / N ( /)으로 나누기 , 0과 1 ( r) 사이의 난수를 만들고 난수가 있는지 확인하십시오. 숫자가 1 / N보다 작습니다. 또는,

ir*1<

을 입력하고 ( i) 0과 1 ( r*) 사이의 난수를 곱한 다음 결과가 1 ( 1<) 보다 작은 지 확인하십시오 .

MATL이 아닌 Matlab에서이 익명 함수를 수행 할 수 있습니다.

@(n)n*rand<1

ans(5)예를 들어 12 바이트에 대해 사용됩니다 .


10

자바 스크립트 ES6, 15 바이트

Downgoat 덕분에 -5 바이트

x=>1>new Date%x

답변의 기술을 기반으로 사용합니다 .


1
new Date작동하고 몇 바이트를 절약 할 수 있습니다
Downgoat

@ Downgoat 아, 맞아, 날짜 임의성!
Conor O'Brien

10

줄리아, 17 16 15 바이트

n->2>rand(1:n)

이것은 1과 1 사이의 임의의 정수를 생성하는 함수입니다 n 그것이 2보다 작은 지 여부를 테스트 입니다.이 일이 발생할 확률은 1 / n이며 따라서 1 / n이 돌아올 확률이 true있습니다.

Thomas Kwa 덕분에 1 바이트를 절약했습니다!



8

사탕 , 2 바이트

Hn

HHeisen-double의 약자

아닙니다

'n'은 숫자 입력으로 -i 플래그와 함께 전달됩니다. 스택에 남은 값은 종료시 인쇄됩니다.

"긴"형태 :

rand   # number between 0 and pop()
not    # cast to int, invert non-zero to zero, and zero to one

-i1 바이트 로 계산해야한다고 생각합니다 .
lirtosiast

1
기본적으로 숫자 입력을 전달하는 유일한 방법은 -i 플래그를 사용하는 것입니다. stdin에서 읽은 언어에만 입력 사양이 부과되지 않는다고 생각합니까?
데일 존슨

글쎄, 일반 입력 플래그가 있거나 인수를 전달하기 위해 방금 일반 CLA를 사용했다면 분명히 괜찮을 것입니다. 그러나 데이터 유형이 무료로 지정되는 것은 불공평합니다.
lirtosiast

2
@ThomasKwa 동적 언어로 작성된 함수는 문서에서 인수가 정수임을 지정하기 위해 바이트를 계산해야합니까? 에서 lambda x: random.random()<1/x(ungolfed) 또한 인수가 숫자이다 "무료로 지정된"입니다.
user253751

@immibis 흠, 그게 좋은 지적이야. 그렇다면 프로그램과 기능에 대한 규칙을 동일하게 유지하려고하면이를 허용해야합니다. 메타에 글을 올리겠습니다.
lirtosiast


7

R, 30 22 바이트

암호

cat(runif(1)<1/scan())          #new
f=function(N)cat(runif(1)<1/N)  #old

균일 분포 (0-1)에서 숫자를 생성하며 횟수의 true 1 / n으로 평가해야합니다.


6

apt, 6 바이트

1>U*Mr

온라인으로 사용해보십시오!

MrJS와 동일합니다 Math.random. 나머지는 꽤 분명합니다. 아마도 0과 숫자 사이에 임의의 부동 소수점을 생성하는 숫자 함수를 추가 할 수 있습니다. 이 경우 두 바이트가 저장됩니다.

1>Ur    // Doesn't currently work

대체 버전 :

1>Ð %U

Ð는에 해당 new Date(하며 Date 객체는 숫자로 변환하도록 요청 될 때 현재 타임 스탬프 (밀리 초)가됩니다. 따라서 이것은 ms 당 여러 번 실행되지 않는 한 전적으로 무작위입니다.


6

놀라운 , 21 바이트

}0    # takes one input n
--    # decrements n
??    # random value from range 0..n (inclusive)
=0?0  # push right if not equal to 0, fall through otherwise | convert to zero
++    # increment | no-op
{0//  # output | push left

Marbelous가 실제로 if를 가지고 있지 않다는 것을 볼 이유가 없지만 0허위와 진실로 취 했습니다 1. {0진실과 {>거짓 을 위해 더 많은 Marbelousy가 출력 될 것이다 . 이것은 다음과 같습니다

}0
--
??
=0{>
{0

그러나 그것이 확실하지 않습니다.


나는 이것에 대한 메타 토론을 할 것입니다. 내 견해의 짧은 버전 : 다른 출력으로 값을 출력하는 것은 다른 언어로 다른 출력 튜플을 갖는 것과 같습니다. (nil, 1) 및 (1, nil)이 다른 언어로 진실되고 거짓된 값이 될 수 있으면 Marbelous에서 {0 vs {>을 허용해야합니다. 추신 : 다른 출력을 채우지 않기 때문에 {> 버전이 종료되지 않습니다.
Sparr

@Sparr 비활성으로 인해 종료됩니다.
overactor

네가 옳아. 바보 같아
Sparr

6

APL, 6 3 바이트

+=?

이것은 정수를 취하고 1 또는 0 (APL의 참 / 거짓)을 반환하는 함수 트레인입니다. 를 사용하여 1에서 입력까지 임의의 정수를 생성 한 ?다음 입력이 해당 정수와 같은지 확인하십시오. 그 결과 1 / 입력 기회가 참이됩니다.

Thomas Kwa 덕분에 3 바이트를 절약했습니다!


@ThomasKwa 나는 일종의 기차에 대해 생각했지만 할당 된 경우 실제로 "명명 된 기능"으로 간주됩니까? "명명 된"부분은 비정형이기 때문에 여기에 나를 던지고 있다고 생각합니다.
Alex A.

@ThomasKwa 열차 및 파생 기능의 할당은 다른 모든 할당과 완전히 유사합니다.
Adám

@NBZ what do you mean by parallel?
lirtosiast

@ThomasKwa Equivalent; behaving like any other function assignment.
Adám

복소수에 대한 공액을 의미 하기 때문에 '+'대신에 사용 +합니다. 물론 여기서는 중요하지 않으며 +전통적인 정체성 (no-op) 기능이지만, 이제는 동일합니다. 스칼라에 대한 다른 어떤 작전은 다음과 같습니다 (구체화), (선택), (묶으), (분할), (혼합), (독특한), (참여), ,(라벨), (테이블), (역), (역 먼저) 및 (조옮김). 일부는 스칼라를 벡터 또는 행렬로 변경합니다.
Adám

6

PlatyPar , 3 바이트

#?!

#? gets a random number [0,n) where n is input. ! returns true if the number before it is 0, else it returns false.

Using more recent features that were implemented (but unfortunately for me not committed) before this question was asked I can get it down to 2 with ~! Try it online!


5

Java, 43 bytes

boolean b(int a){return a*Math.random()<1;}

1
a->a*Math.random()<1 is shorter.
TheNumberOne

Should specify "Java 7 or earlier".
corsiKa

@corsiKlauseHoHoHo This works in Java 8 as well though
SuperJedi224

1
Of course it does - but it's not golfed for Java 8, which would use lambdas to save space. By that logic, all Java answers are also Groovy answers, but Groovy is always the same or smaller because it has shortcuts that Java doesn't.
corsiKa

5

C, 24 bytes

f(n){return!(rand()%n);}

I've rolled back OP's edit removing the first 4 characters. It's nice to have bytes reduced, but to me, having the returnwithout the f(n) doesn't make any sense syntactically.
Level River St

1
@insertusernamehere rand()%n is a standard way of getting a random number in the range 0..n-1. You are correct, it does rely on n being much smaller than RAND_MAX but there is no upper limit for n mentioned in the question. An alternative approach would be to do a reject and re-roll on all numbers from n to RAND_MAX but it would be hopelessly inefficient at small n.
Level River St

5

><>, 27 + 3 for -v = 30 bytes

Here is a not-uniform-at-all solution where I mod N the sum of 15876 random picks of 0 or 1 :

0"~":*>:?vr%0=n;
1-$1+$^-1x

N must be input on the stack with -v flag, output is 0 for falsey and 1 for truthy.

A much smarter and uniform solution that work for 1/2^N instead :

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n;
1n;>
 

For an input 3 you've got 1/8 chances of getting 1 and 7/8 of getting 0.

Explanation :

I append as much x as needed on the 4th line and surround them with directions so there is only two ways out of the x: either the falsey output or the next x. If all x go in the right direction, the last one will route to the truthy output.

For example for N=5, the final codespace is the following :

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n; > > > > >
1n;>x>x>x>x>x>
    ^ ^ ^ ^ ^

While it's true you can't get a perfect distribution for arbitrary N, neither can anyone else using a PRNG. You could loop through an x a few times to get a bunch of random bits, assemble them into an int I, then use I%N as your random value.
Sparr

@Sparr edited my answer but I feel like using a big number of iteration will 'average out' the resulting integer, making the output heavily tend toward (iterNum/2)%N. I don't think using a lower number would be a solution either. Did I maybe not quite understood you, or would you have any further idea to better the solution?
Aaron

instead of adding 15000 bits together, produce just 32 bits and concatenate them, giving you a uniformly distributed 32-bit random integer. mod that.
Sparr

@Sparr that seems better indeed, even if I've no idea why ;) That'll cost much more bytes (><> sucks for byte operations & base conversion) but I'll change my answer this evening (CEST).
Aaron

you can concatenate bits by multiplying by two and adding: r=0; for(0..32) r=r*2+randbit;
Sparr

4

Mathematica, 18 16 bytes

#RandomReal[]<1&

Basic solution. The unnamed Function creates a random number in [0, 1), multiplies it by its argument, and checks if it is still less than 1.


4

Python, 42 bytes

import random
lambda n:1>random.random()*n

Edit: Removed the time.time() answer because of the distribution.


2
For random, it's worth doing from random import* to save on random.. Not for time though.
xnor

1
Random numbers generated by modulo division are not uniformly distributed.
Trang Oul

@TrangOul That's a good point; for larger n the effect could be noticeable. I think 1>time.time()%1*n could work.
lirtosiast

@TrangOul I presume you know the difference between rand in C, and time.time in Python... One obvious feature of the latter is that it returns the current time, which is unbounded, so that time.time()%n has a uniform distribution (over long enough periods of time) for any n.
user253751

4

TeaScript, 3 bytes

!N×

Try it here.

Explanation

 N  maps to Math.rand which is a utility function that returns an integer
    between `arg1` and `arg2` or `0` and `arg1` if only one argument is
    provided.
  × is expanded to `(x)`, where `x` is initialised with the value provided
    in the input boxes; × represents byte '\xd7'
!   negate the result, 0 results in true, anything else false

1
How does seven chars add up to 6 bytes? And is the (R) a (single byte) ANSI char?
Adám

@NBZ, haha! I think I lied... I blame hangover... I'll update now as I'm going to change the mechanism to a more straightforward one that I've just noticed! In this current version the ® represents the char '\xae' so is just one byte. :)
Dom Hastings

4

Fuzzy Octo Guacamole, 10 bytes

^-!_[0]1.|

Explanation:

^-!_[0]1.|

^          # Get input.
 -         # Decrement, so we can append <ToS> zeros and a 1 to the stack.
  !        # Set loop counter.
   _       # Pop, since we are done with the input.
    [      # Start loop
     0     # Push 0
      ]    # End for loop. We have pushed input-1 0s to the stack.
       1   # Push a single 1 to the stack.
        .  # Switch stacks
         | # Pick a random item from the inactive stack, which has n-1 falsy items and 1 truthy item, so the truthy probability is 1/n.
           # (implicit output)

3

Perl 6,  10  8 bytes

!(^*).pick
#  ^- The * is the argument

This code creates a Range from 0 up-to but excluding the input *. It then picks one at random and the ! returns True when it receives a 0.

1>*.rand
# ^- The * is the argument

This takes the input * and multiplies it by a random Num from 0..^1 then returns True if it was smaller than 1.

# store it in a lexical code variable for ease of use
my &code = 1>*.rand;

die "never dies here" unless code 1;

for ^8 { say code 4 }
False
True
False
False
False
True
False
False

3

Prolog (SWI), 24 bytes

Code:

p(N):-X is 1/N,maybe(X).

maybe(+P) is a function which succeeds with probability P and fails with probability 1-P

Example:

p(4).
false

p(4).
false

p(4).
true

3

PowerShell, 25 Bytes

!(Random -ma($args[0]--))

The Get-Random function when given a -Maximum parameter n returns a value from the range [0,n). We leverage that by subtracting 1 from our input $args[0], so we're properly zero-indexed, and get a random value. Precisely 1/nth of the time, this value will be 0, so when we Boolean-not it with ! it will return True. The other times will return False.


3

J, 3 bytes

0=?

This is a monadic fork that takes an argument on the right. Similarly to APL, ? generates a random integer; however, J arrays are zero-based. So we compare to 0 instead of to the input.


3

Minkolang 0.14, 7 bytes

1nH1=N.

Try it here.

Explanation

1          Pushes 1
 n         Takes number from input
  H        Pops b,a and pushes a random integer between a and b, inclusive
   1=      1 if equal to 1, 0 otherwise
     N.    Output as number and stop.

3

PHP, 22 bytes

<?=2>rand(1,$argv[1]);

Reads n from command line, like:

$ php probability.php 4

Outputs (false is cast to an empty string in PHP) or 1 (in case of true).


3

C#, 56 45 bytes

Thanks to, pinkfloydx33 it's 45 now.

bool b(int n){return new Random().Next(n)<1;}

Old 56 bytes

Generates random positive integer bigger or equal to 0 and smaller than n and checks if it's smaller than 1 and return comparison result.

bool a(int n){Random r=new Random();return r.Next(n)<1;}

1
Welcome to PPCG! Unfortunately, this submission doesn't work, because Random.Next(k) returns an integer k such that 0 <= k < n. By changing the condition to <1, it will be correct. In addition, the use of a lambda expression may get your code shorter.
Mego

@Mego Sure, thank you for comment. I made it 0 < k <= n and it should be like you said. I'll correct it immediately.
ivaan

2
Use var r saves three. Or if c#6, bool a(int n) => new Random().Next(n)<1; for 41. Though not sure if initializing a new Random per method call will work properly as far as distribution?
pinkfloydx33

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