Xác suất 1 / N


29

Bởi vì không có đủ thử thách đơn giản :

Tạo một chương trình hoặc hàm không tên tùy chọn, được đưa ra (bằng mọi cách) một số nguyên 1 ≤ N 10000, đưa ra giá trị True của ngôn ngữ của bạn với xác suất giả ngẫu nhiên là 1 / N, nếu không thì sai.

Xin lưu ý rằng yêu cầu đặt tên đã được loại bỏ. Hãy chỉnh sửa câu trả lời và điểm số phù hợp.

Một số ngôn ngữ sử dụng 1 (hoặc -1) và 0 cho Đúng và Sai, điều đó cũng tốt.

Thí dụ:

Ví dụ kiểm tra đầu vào:

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

Tức là đã cho 4; nó trả về True với 25% cơ hội và Sai với 75% cơ hội.




Vì không phải tất cả các ngôn ngữ đã được xây dựng trong "giả danh", liệu có thể lấy hạt giống làm đối số thứ hai không? (Ví dụ: Brainfuck)
flawr

@flawr sử dụng mili giây hiện tại ...
Adám

1
Cái gì lớn nhất Nchúng ta phải chấp nhận?
Toby Speight

Câu trả lời:


27

Các mẫu MediaWiki với ParserFifts , 48 byte

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

13
Lựa chọn ngôn ngữ thú vị :-)
Adám

6
Ai đã nghĩ rằng việc thêm các hàm không xác định vào các mẫu MediaWiki!
dùng253751

4
@immibis: cũng là sự không xác định xảy ra từ #time, có lẽ là để cập nhật tuổi của người sống, v.v.
Willem Van Onsem

15

Bình thường, 3 byte

!OQ

Dùng thử trực tuyến

Đảo ngược đơn giản của sự lựa chọn ngẫu nhiên từ 0 đến đầu vào

Thật thú vị trong Pyth, không thể thực hiện một chức năng thực hiện việc này mà không có $chức năng Pyth được tự động ghi nhớ.



@LeakyNun À đúng rồi, tôi đã quên mất việc sử dụng thời gian cho một chức năng ngẫu nhiên, điều đó khá thông minh.
FryAmTheEggman

Không, tôi chỉ sử dụng thời gian để ghi nhớ nó.
Leaky Nun

1
Tôi biết, tôi đoán là tôi đã không nói tốt: P Điều đó nói rằng tôi không nghĩ nó sẽ thực sự hoạt động như một cách giải quyết cho hầu hết các bài nộp, nếu nó tốt hơn một chương trình đầy đủ vì một số lý do. Theo mặc định, việc dành thời gian làm đối số có lẽ không được phép.
FryAmTheEggman

1
@LeakyNun Tôi tin rằng câu hỏi này có trước khi Qđiền vào cuối, vì nếu không tôi sẽ trả lời !O;)
FryAmTheEggman

12

CJam, 5 byte

Hãy nhanh chóng với những thứ này ...

rimr!

Kiểm tra nó ở đây.

Giải trình

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
" Phải nhanh chóng với những người này ... " đó là một lý do để không đồng ý với OP rằng " không có đủ các thử thách chơi gôn đơn giản ". Nếu FGITW là một vấn đề, IMO thì quá đơn giản.
Peter Taylor

12

TI-BASIC, 4 byte sử dụng mã thông báo một byte

not(int(Ansrand

Xác định xem phần nguyên của số lần nhập một số ngẫu nhiên trong [0,1) bằng không. Ansrand<1cũng hoạt động.


Làm thế nào ... đó là bốn byte?
John Dvorak

3
@JanDvorak Các byte đầu tiên không phải là (, tiếp theo là int (, tiếp theo là Ans, tiếp theo là rand. Nói chung, các máy tính vẽ đồ thị không sử dụng ASCII làm đại diện nội bộ cho các chương trình.
user253751 19/12/15

@immibis Nói chung, máy tính cũng không sử dụng ASCII. Điều này có thể là nghi vấn, có một cuộc thảo luận meta về điều đó?
Kroltan

7
@Kroltan Có; đây là cuộc thảo luận meta và đây là danh sách các mã thông báo có một byte, bao gồm tất cả bốn mã mà tôi đã sử dụng.
lirtosiast

@ThomasKwa cảm ơn!
Kroltan

11

MATL, 5 byte

Ba phiên bản khác nhau của cái này, tất cả đều dài 5.

iYr1=

trong đó lấy một đầu vào ( i), tạo một số nguyên ngẫu nhiên giữa 1 và số đó ( Yr) và xem nó có bằng 1 ( 1=) không. Ngoài ra,

li/r>

tạo 1 ( l, một cách giải quyết vì có lỗi khi thực hiện 1itại thời điểm này), lấy đầu vào ( i), chia để lấy 1 / N ( /), tạo một số ngẫu nhiên trong khoảng từ 0 đến 1 ( r) và xem nếu ngẫu nhiên số nhỏ hơn 1 / N. Hoặc là,

ir*1<

lấy và nhập ( i) và nhân với một số ngẫu nhiên trong khoảng từ 0 đến 1 ( r*) và xem kết quả có nhỏ hơn 1 ( 1<) không.

Trong Matlab, không phải MATL, bạn có thể thực hiện chức năng ẩn danh này

@(n)n*rand<1

cho 12 byte, được sử dụng bằng cách làm ans(5), ví dụ.


10

JavaScript ES6, 15 byte

-5 byte nhờ vào Downgoat.

x=>1>new Date%x

Dựa tắt (sử dụng) của này kỹ thuật của câu trả lời.


1
new Datecũng có thể hoạt động và có thể tiết kiệm một vài byte
Downgoat

@Downgoat À, đúng rồi, ngày ngẫu nhiên!
Conor O'Brien

10

Julia, 17 16 15 byte

n->2>rand(1:n)

Đây là một hàm tạo ra một số nguyên ngẫu nhiên trong khoảng 1 và nkiểm tra xem nó có nhỏ hơn 2. Sẽ có cơ hội 1 / n cho điều này xảy ra hay không, và do đó, cơ hội quay lại 1 / n true.

Lưu được 1 byte nhờ Thomas Kwa!


9

Kính hiển vi II , 3 byte

NR!

Đọc một số nguyên n, tạo một số nguyên ngẫu nhiên giữa 0n-1(bao gồm), sau đó áp dụng một phủ định boolean cho giá trị đó.


8

Kẹo , 2 byte

Hn

H là viết tắt của Heisen-double

n là viết tắt của không

'N' được truyền với cờ -i làm đầu vào số. Các giá trị còn lại trên ngăn xếp được in trên lối ra.

Mẫu "dài":

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

Tôi nghĩ bạn cần tính -ilà một byte.
lirtosiast

1
về cơ bản, cách duy nhất để vượt qua đầu vào số là với cờ -i. Tôi đoán chỉ các ngôn ngữ đọc từ stdin không bị phạt đặc tả đầu vào?
Dale Johnson

Chà, nếu có một cờ đầu vào chung chung, hoặc bạn chỉ sử dụng CLA thông thường để truyền các đối số, điều đó chắc chắn sẽ ổn. Dường như không công bằng khi kiểu dữ liệu đang được chỉ định miễn phí.
lirtosiast

2
@ThomasKwa Một hàm được viết bằng ngôn ngữ động phải đếm các byte để xác định rằng đối số là một số nguyên trong tài liệu? Trong lambda x: random.random()<1/x(không được phép), nó cũng "được chỉ định miễn phí" rằng đối số là một số.
dùng253751

@immibis Hmm, đó là một điểm tốt. Tôi đoán cố gắng giữ các quy tắc cho các chương trình và chức năng giống nhau sẽ cho phép điều này, sau đó. Tôi sẽ tạo một bài đăng trên meta.
lirtosiast

7

Seriously, 3 bytes

,JY

0 is falsey and 1 is truthy. Try it online

Explanation:

,JY
,    get input
 J   push a random integer in range(0, input) ([0, ..., input-1])
  Y  logical not: push 0 if truthy else 1  

7

R, 30 22 byte

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

Nó tạo ra một số từ phân phối đồng đều (0 đến 1) và nên đánh giá đúng 1 / n lần.


6

Japt, 6 byte

1>U*Mr

Hãy thử trực tuyến!

Mrtương đương với JS Math.random. Phần còn lại là khá rõ ràng. Tôi có thể có thể thêm một hàm số tạo ra một số float ngẫu nhiên giữa 0 và số. Khi điều này xảy ra, hai byte sẽ được lưu:

1>Ur    // Doesn't currently work

Phiên bản thay thế:

1>Ð %U

Ðtương đương với new Date(và đối tượng Date, khi được yêu cầu chuyển đổi thành số, trở thành dấu thời gian hiện tại tính bằng mili giây. Do đó, điều này là hoàn toàn ngẫu nhiên, trừ khi nó được chạy nhiều lần trong mỗi ms.


6

Tuyệt vời , 21 byte

}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

Tôi đã 0trở thành chim ưng và 1thành thật, mặc dù không có lý do thực sự nào cho thấy rằng Marbelous không thực sự có nếu. Nhiều điều đáng tin hơn sẽ là đầu ra {0cho đúng và {>sai. Điều này sẽ trông như thế này:

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

Nhưng tôi không chắc là hợp lệ.


Tôi sẽ lên cho một cuộc thảo luận meta về điều này. Phiên bản ngắn của quan điểm của tôi: đưa ra một giá trị cho một đầu ra khác tương đương với việc có các bộ dữ liệu đầu ra khác nhau trong ngôn ngữ khác. Nếu (nil, 1) và (1, nil) có thể là giá trị trung thực và falsey của bạn trong một ngôn ngữ khác, thì {0 so với {> nên được cho phép trong Marbelous. PS: phiên bản {> của bạn sẽ không thoát vì bạn không bao giờ điền vào đầu ra khác.
Sparr

@Sparr nó sẽ thoát do không hoạt động, phải không?
overactor

Bạn đúng. Tôi thấy ngớ ngẩn.
Sparr

6

APL, 6 3 byte

+=?

Đây là một hàm đào tạo lấy một số nguyên và trả về 1 hoặc 0 (APL's true / false). Chúng tôi tạo một số nguyên ngẫu nhiên từ 1 đến đầu vào bằng cách sử dụng ?, sau đó kiểm tra xem đầu vào có bằng số nguyên đó không. Điều đó dẫn đến cơ hội 1 / đầu vào là đúng.

Lưu được 3 byte nhờ Thomas Kwa!


@ThomasKwa Tôi đã nghĩ về một loại tàu nào đó, nhưng nó có thực sự được tính là "chức năng được đặt tên" nếu được chỉ định không? Tôi đoán phần "được đặt tên" đang ném tôi đến đây vì nó không điển hình.
Alex A.

@ThomasKwa Phân công các đoàn tàu (và các hàm xuất phát) hoàn toàn song song với tất cả các nhiệm vụ khác.
Adám

@NBZ có nghĩa là gì song song?
lirtosiast

@ThomasKwa Tương đương; hành xử như bất kỳ sự phân công chức năng khác.
Adám

Tôi sẽ sử dụng thay vì '+' vì +có nghĩa là Liên hợp cho các số phức. Tất nhiên nó không quan trọng ở đây, và +là chức năng nhận dạng truyền thống (no-op), nhưng bây giờ chúng ta có (giống nhau). Các no-op khác cho vô hướng là: (vật chất hóa), (chọn), (kèm theo), (tách), (trộn), (duy nhất), (liệt kê), ,(ravel), (bảng), (đảo ngược), (đảo ngược đầu tiên) và (chuyển vị). Một số thay đổi vô hướng thành một vectơ hoặc ma trận.
Adám 31/12/15

6

PlatyPar , 3 byte

#?!

#?được một số ngẫu nhiên [0,n)trong đó nlà đầu vào. !trả về truenếu số trước nó là 0, nó sẽ trả vềfalse .

Sử dụng nhiều tính năng gần đây đã được triển khai (nhưng thật không may cho tôi không cam kết) trước khi câu hỏi này được hỏi tôi có thể giảm xuống còn 2 với ~! Thử trực tuyến !


5

Java, 43 byte

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

1
a->a*Math.random()<1ngắn hơn
TheNumberOne

Nên chỉ định "Java 7 hoặc sớm hơn".
corsiKa

@corsiKlauseHoHoHo Điều này cũng hoạt động trong Java 8
SuperJedi224

1
Tất nhiên là có - nhưng nó không được chơi cho Java 8, mà sẽ sử dụng lambdas để tiết kiệm không gian. Theo logic đó, tất cả các câu trả lời Java cũng là câu trả lời Groovy, nhưng Groovy luôn giống hoặc nhỏ hơn vì nó có các phím tắt mà Java không có.
corsiKa

5

C, 24 byte

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

Tôi đã khôi phục chỉnh sửa của OP loại bỏ 4 ký tự đầu tiên. Thật tuyệt khi giảm byte, nhưng với tôi, việc returnkhông f(n)có không có ý nghĩa về mặt cú pháp.
Cấp sông St

1
@insertusernamehere rand()%nlà một cách tiêu chuẩn để nhận một số ngẫu nhiên trong phạm vi 0..n-1. Bạn đã đúng, nó dựa vào nviệc nhỏ hơn nhiều RAND_MAXnhưng không có giới hạn trên để nđề cập trong câu hỏi. Một cách tiếp cận khác là từ chối và cuộn lại tất cả các số từ nđến RAND_MAX nhưng nó sẽ vô hiệu quả ở mức nhỏ n.
Cấp sông St

5

> <>, 27 + 3 cho -v = 30 byte

Đây là một giải pháp không đồng nhất ở tất cả, trong đó tôi mod N tổng số 15876 lượt chọn ngẫu nhiên là 0 hoặc 1:

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

N phải là đầu vào trên ngăn xếp với cờ -v, đầu ra là 0 cho falsey và 1 cho sự thật.

Thay vào đó, một giải pháp thông minh và thống nhất hơn có hiệu quả cho 1/2 ^ N:

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

Đối với đầu vào 3, bạn có 1/8 cơ hội nhận 1 và 7/8 khi nhận 0.

Giải trình :

Tôi nối thêm bao nhiêu xcần thiết trên dòng thứ 4 và bao quanh chúng theo chỉ dẫn để chỉ có hai cách để thoát ra x: hoặc là đầu ra falsey hoặc tiếp theo x. Tôi ngãx đi đúng hướng, người cuối cùng sẽ định tuyến đến đầu ra trung thực.

Ví dụ cho N = 5, không gian mã cuối cùng là như sau:

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

Mặc dù đúng là bạn không thể có được một bản phân phối hoàn hảo cho N tùy ý, nhưng không ai khác có thể sử dụng PRNG. Bạn có thể lặp qua một vài lần để có được một loạt các bit ngẫu nhiên, tập hợp chúng thành một int I, sau đó sử dụng I% N làm giá trị ngẫu nhiên của bạn.
Sparr

@Sparr đã chỉnh sửa câu trả lời của tôi nhưng tôi cảm thấy việc sử dụng số lần lặp lớn sẽ 'lấy trung bình' số nguyên kết quả, khiến đầu ra có xu hướng rất lớn (iterNum/2)%N. Tôi không nghĩ sử dụng số thấp hơn cũng là một giải pháp. Có lẽ tôi không hoàn toàn hiểu bạn, hoặc bạn có ý tưởng nào tốt hơn để giải quyết tốt hơn không?
Aaron

thay vì cộng 15000 bit lại với nhau, chỉ tạo 32 bit và ghép chúng lại, tạo cho bạn một số nguyên ngẫu nhiên 32 bit được phân phối đồng đều. mod mà.
Sparr

@Sparr có vẻ thực sự tốt hơn, ngay cả khi tôi không biết tại sao;) Điều đó sẽ tốn nhiều byte hơn (> <> hút cho các hoạt động byte & chuyển đổi cơ sở) nhưng tôi sẽ thay đổi câu trả lời của mình tối nay (CEST).
Aaron

bạn có thể nối các bit bằng cách nhân hai và thêm: r = 0; cho (0..32) r = r * 2 + randbit;
Sparr

4

Toán học, 18 16 byte

#RandomReal[]<1&

Giải pháp cơ bản. Số chưa đặt tên Functiontạo một số ngẫu nhiên trong [0, 1), nhân số đó với đối số của nó và kiểm tra xem nó có nhỏ hơn 1 không.


4

Python, 42 byte

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

Chỉnh sửa : Đã xóa time.time()câu trả lời vì phân phối.


2
Đối với random, nó đáng để làm from random import*để tiết kiệm random.. Không phải timemặc dù.
xnor

1
Các số ngẫu nhiên được tạo ra bởi sự phân chia modulo không được phân phối đồng đều .
Trang Oul

@TrangOul Đó là một điểm tốt; cho nhiệu quả lớn hơn có thể được chú ý. Tôi nghĩ rằng 1>time.time()%1*ncó thể làm việc.
lirtosiast

@TrangOul Tôi cho rằng bạn biết sự khác biệt giữa randC và time.timetrong Python ... Một đặc điểm rõ ràng của cái sau là nó trả về thời gian hiện tại , không bị ràng buộc, do đó time.time()%ncó phân phối đồng đều (trong khoảng thời gian đủ dài) cho bất kỳ n.
dùng253751

4

TeaScript , 3 byte

!N×

Hãy thử nó ở đây.

Giải trình

 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
Làm thế nào để bảy ký tự thêm tối đa 6 byte? Và có phải là (R) một (một byte) ANSI char không?
Adám

@NBZ, haha! Tôi nghĩ rằng tôi đã nói dối ... Tôi đổ lỗi cho sự nôn nao ... Tôi sẽ cập nhật ngay bây giờ vì tôi sẽ thay đổi cơ chế thành một cơ chế đơn giản hơn mà tôi vừa nhận thấy! Trong phiên bản hiện tại này, ®đại diện cho char '\xae'chỉ là một byte. :)
Dom Hastings

4

Oczzy Guacamole, 10 byte

^-!_[0]1.|

Giải trình:

^-!_[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 byte

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

Mã này tạo Phạm vi từ 0 trở lên nhưng không bao gồm đầu vào *. Sau đó, nó picklà một ngẫu nhiên và !trả về True khi nhận được a 0.

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

Cái này lấy đầu vào *và nhân nó bằng một Num ngẫu nhiên từ 0..^1đó trả về True nếu nó nhỏ hơn 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 byte

Mã số:

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

có lẽ (+ P) là hàm thành công với xác suất P và thất bại với xác suất 1-P

Thí dụ:

p(4).
false

p(4).
false

p(4).
true

3

PowerShell, 25 byte

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

Các Get-Randomchức năng khi đưa ra một -Mathông số ximum ntrả về một giá trị từ dãy núi này [0,n). Chúng tôi tận dụng điều đó bằng cách trừ 1 từ đầu vào của chúng tôi $args[0], vì vậy chúng tôi được lập chỉ mục chính xác và nhận được một giá trị ngẫu nhiên. Chính xác 1/nlà thời gian, giá trị này sẽ là 0, vì vậy khi chúng ta Boolean - không phải !nó sẽ quay trở lại True. Những lần khác sẽ trở lại False.


3

J, 3 byte

0=?

Đây là một ngã ba đơn điệu có một đối số ở bên phải. Tương tự như APL ,? tạo ra một số nguyên ngẫu nhiên; tuy nhiên, mảng J là không dựa trên. Vì vậy, chúng tôi so sánh với 0 thay vì đầu vào.



3

PHP, 22 byte

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

Đọc ntừ dòng lệnh, như:

$ php probability.php 4

Các đầu ra ( falseđược truyền tới một chuỗi rỗng trong PHP) hoặc 1(trong trường hợp true).


3

C #, 56 45 byte

Cảm ơn, Pinkfloydx33 bây giờ là 45.

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

56 byte cũ

Tạo số nguyên dương ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn nvà kiểm tra xem nó nhỏ hơn 1và trả về kết quả so sánh.

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

1
Chào mừng đến với PPCG! Thật không may, đệ trình này không hoạt động, bởi vì Random.Next(k)trả về một số nguyên knhư vậy 0 <= k < n. Bằng cách thay đổi điều kiện thành <1, nó sẽ chính xác. Ngoài ra, việc sử dụng biểu thức lambda có thể khiến mã của bạn ngắn hơn.
Mego

@Mego Chắc chắn, cảm ơn bạn đã bình luận. Tôi đã làm nó 0 < k <= nvà nó sẽ giống như bạn nói. Tôi sẽ sửa nó ngay lập tức.
ivaan

2
Sử dụng var rtiết kiệm ba. Hoặc nếu c # 6, bool a(int n) => new Random().Next(n)<1;cho 41. Mặc dù không chắc chắn nếu khởi tạo một Randomcuộc gọi mới cho mỗi phương thức sẽ hoạt động đúng như phân phối?
Pinkfloydx33

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.