Xác suất cặp thẻ


9

Cho một cỗ bài gồm N bản sao của thẻ có giá trị nguyên [ 1 , M ] cho tổng số thẻ N * M , hãy tính xác suất để thẻ có giá trị 1 liền kề với thẻ có giá trị là 2 .

Giải pháp của bạn có thể chính xác hoặc gần đúng và không cần phải giống nhau cho mỗi lần chạy với cùng một đầu vào. Câu trả lời đã cho phải nằm trong khoảng +/- 5% so với giải pháp thực sự (loại bỏ các cơ hội thực sự hiếm có RNG không có lợi cho bạn). Chương trình của bạn sẽ đưa ra câu trả lời trong một khoảng thời gian hợp lý (giả sử, dưới 10 phút cho bất kỳ phần cứng nào bạn có). Bạn có thể cho rằng MN là nhỏ hợp lý và không cần kiểm tra lỗi.

Bộ bài không theo chu kỳ, vì vậy nếu thẻ đầu tiên là 1 và thẻ cuối cùng là 2 , thì điều này không đáp ứng các yêu cầu kề.

Như một trường hợp thử nghiệm, với N = 4M = 13 (một cỗ bài 52 lá tiêu chuẩn), giải pháp dự kiến ​​là ~ 48,6%.

Dưới đây là một ví dụ về triển khai không được đánh gôn trong Python + NumPy bằng cách sử dụng các xáo trộn ngẫu nhiên:

from __future__ import division
from numpy import *

def adjacent(N, M):
    deck = array([i for i in range(1, M+1)]*N)
    trials = 100000
    count = 0
    for i in range(trials):
        random.shuffle(deck)
        ores = (deck == 1)
        tres = (deck == 2)
        if(any(logical_and(ores[1:], tres[:-1])) or
           any(logical_and(ores[:-1], tres[1:]))):
            count += 1
    return count/trials

Đầu ra có thể ở bất kỳ dạng nào bạn thấy thuận tiện (giá trị trả về của hàm, đầu ra đầu cuối, tệp, v.v.) và đầu vào có thể ở bất kỳ dạng nào bạn thấy thuận tiện (tham số chức năng, đầu vào đầu cuối, dòng lệnh arg, v.v.)

Lỗ vòng tiêu chuẩn được áp dụng.

Đây là mã golf, mã ngắn nhất (tính bằng byte) thắng.

Bảng xếp hạng


1
kề nhau không quấn quanh là một vòng xoắn phức tạp
Sparr

@Sparr Bạn đã cho tôi một ý tưởng! :-)
Luis Mendo

Câu trả lời:


2

Bình thường, 23 22 byte

csm}1sM.:.S*vzUQ2J^T4J

Chạy 10000 lần lặp. Số có thể được thay đổi mà không có chi phí byte. Đầu vào là dòng mới tách. Mất khoảng 9 giây trên máy tính của tôi.

Trình diễn

csm}1sM.:.S*vzUQ2J^T4J
                 J^T4     J = 10000
  m              J        Do the following J times.
           *vzUQ          Set up the deck. (0 .. n-1, repeated m times.)
         .S               Shuffle the deck.
       .:       2         Find all 2 elment substrings.
     sM                   Add them up.
   }1                     Check if any pairs add to 1 ([0, 1] or [1, 0])
 s                        Add up the results (True = 1, False = 0)
c                     J   Divide by J.

2

MATL , 44 46 byte

Điều này sử dụng bản phát hành 3.1.0 của ngôn ngữ, sớm hơn thử thách này.

Việc tính toán được thực hiện với một vòng lặp rút ra 1000 hiện thực ngẫu nhiên. Phải mất vài giây để chạy. Nó có thể được thực hiện nhanh hơn theo cách véc tơ. Đầu vào có dạng [N M].

Phiên bản cũ : tạo ra một cỗ bài ngẫu nhiên và kiểm tra hai lần: lần đầu tiên về phía trước và sau đó theo hướng lùi.

itpw1)1e3:"2$twZ@w/Y]t1HhXfnwH1hXfn|bb]xxN$hYm

Phiên bản mới : tạo ra một cỗ bài ngẫu nhiên và sau đó nối thêm một phiên bản lật của nó với một cái 0ở giữa. Cách kiểm tra đó có thể được thực hiện chỉ một lần, theo hướng chuyển tiếp. Điều này tiết kiệm hai byte.

itpw1)1e3:"2$twZ@w/Y]tP0whh1HhXfngbb]xxN$hYm

Thí dụ

>> matl itpw1)1e3:"2$twZ@w/Y]tP0whh1HhXfngbb]xxN$hYm
> [4 13]
0.469

Giải trình

i                 % input: [N M]
tpw1)             % produce N*M and N
1e3:"             % repeat 1000 times
  2$twZ@w/Y]      % produce random deck of cards from 1 to N*M
  tP0whh          % append 0 and then flipped version of deck
  1Hh             % vector [1 2]
  Xf              % find one string/vector within another                          
  ng              % was it found at least once?
  bb              % bubble up element in stack, twice                     
]                 % end                                                     
xx                % delete top of the stack, twice
N$h               % vector with all elements in stack
Ym                % mean value


1

Bình thường, 16 byte

JE?>J1-1^-1c2JQZ

Trình diễn.

Điều này theo sau

  • đoán
  • kiểm tra xem nó đủ gần chưa
  • nói lại

chiến lược lập trình. Dự đoán giáo dục chiến thắng trong trường hợp này là

1 - (1 - 2 / M) ** N

mà đại khái nói rằng có Ncơ hội rơi vào xô, và một phần của xô hợp lệ là 2 / M. Các thùng là các vị trí đặt bên cạnh 0s và cơ hội là 1s.

Lỗi dường như không bao giờ vượt quá 3% (đáng ngạc nhiên) và dường như hội tụ đến 0% khi các tham số trở nên lớn hơn (như tôi mong đợi).

Đầu vào là dòng mới tách.

              Q  Q = eval(input())
JE               J = eval(input())
  ?>J1           if J > 1
      -1^-1c2JQ  then 1 - (1 - 2 / J) ** Q
               Z else 0

Bạn có thể lưu một ký tự nếu bạn chấp nhận thực tế rõ ràng đó False == 0JE&>J1-1^-1c2JQthay vào đó.


Đây là lần đầu tiên tôi đến Pyth (và câu trả lời đầu tiên của tôi), vì vậy những lời chỉ trích và giúp đỡ đặc biệt được hoan nghênh.
Veedrac

1

MATL , 44 38 byte

Điều này cũng sử dụng MATL phiên bản 3.1.0 , sớm hơn thử thách này.

Phiên bản mới, cảm ơn Luis Mendo vì đã tiết kiệm 4 byte!

iiXI*XJxO1e4XH:"JZ@I\TTo3X53$X+1=a+]H/

Phiên bản cũ (44 byte):

OiitXIx*XJx1e4XH:"JJZrI\[1 1]3X5,3$X+1=a+]H/

Giải trình

i               % take input for N
i               % take input for M
XI              % save M into clipboard I
*XJ             % multiply N and M and store in clipboard J
x               % clear the stack
O               % make a zero to initialise count of pairs
1e4XH:"         % 1e4=10000, XH saves into clipboard H, : makes the vector 1:1e4
                % which is used to index a for loop, started using "
    JZ@         % Use randperm to generate a random permutation of the vector 1:N*M
    I\          % take the result mod M, now each card has a value one less than before
    TTo3X53$X+  % convolve vector of card values with [1 1] to do pairwise summation
    1=a         % find if any sums equal 1, which means there is a [0 1] or [1 0]         
    +           % add the logical value to the count of pairs
]
H/              % divide the count by the number of deals to get the probability

Ví dụ,

>> matl 'iiXI*XJxO1e4XH:"JZ@I\TTo3X53$X+1=a+]H/'
> 4
> 13
0.4861

Lưu ý (21/5/16): Kể từ phiên bản MATL 18.0.0, X+đã bị xóa, nhưng Y+có thể được sử dụng ở vị trí của nó. Các thay đổi từ MATL phiên bản 3.1.0 đến 18.0.0 có nghĩa là câu trả lời này hiện có thể được viết chỉ trong 31 byte , *xO1e4:"2:Gtb*Z@w\TT2&Y+1=ah]Ym.


Tôi biết đã có câu trả lời MATL, nhưng tôi nghĩ các phương pháp khá khác nhau nên tôi vẫn đăng bài này.
David

Tôi yêu sự chập chững!
Luis Mendo

Bạn có thể tiết kiệm một chút thay đổi [1 1]thành TTo. Ngoài ra, bạn không cần dấu phẩy
Luis Mendo

@LuisMendo cảm ơn! Tôi nghĩ rằng phải có một cách tốt hơn để làm điều đó!
David

Bây giờ tôi thấy cách tích chập hoạt động ở đây. Sử dụng cách đặt tên dựa trên 0 của thẻ rất thông minh!
Luis Mendo

0

Toán học, 93 92 91 byte

N@Count[RandomSample@Flatten[Range@#~Table~{#2}]~Table~{a=1*^5},{b=___,1,2,b}|{b,2,1,b}]/a&

Vẫn đang tìm kiếm một hình thức đóng ...


nó sẽ liên quan đến một vòng lặp tính toán hoán vị lồng nhau.
Sparr
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.