ความน่าจะเป็นคู่การ์ด


9

ได้รับดาดฟ้าประกอบด้วยNสำเนาบัตรที่มีค่าจำนวนเต็ม [ 1 , M ] รวมเป็นN * Mบัตรคำนวณความน่าจะเป็นว่าบัตรมีมูลค่าที่1อยู่ติดกับบัตรที่มีค่าของที่2

วิธีการแก้ปัญหาของคุณอาจจะแน่นอนหรือประมาณและไม่จำเป็นต้องเหมือนกันสำหรับการทำงานทุกครั้งที่ได้รับอินพุตเดียวกัน คำตอบที่ให้ควรอยู่ใน +/- 5% ของทางออกที่แท้จริง (ยกเว้นโอกาสที่หายากจริงๆ RNG ไม่ได้อยู่ในความโปรดปรานของคุณ) โปรแกรมของคุณควรให้คำตอบในเวลาที่เหมาะสม (พูดน้อยกว่า 10 นาทีสำหรับฮาร์ดแวร์ใดก็ตามที่คุณมี) คุณอาจสันนิษฐานว่าMและNมีขนาดเล็กและไม่จำเป็นต้องตรวจสอบข้อผิดพลาด

สำรับไม่ได้เป็นวัฏจักรดังนั้นหากไพ่ใบแรกเป็น1และไพ่ใบสุดท้ายเป็น2 ใบนี้จะไม่ตรงตามข้อกำหนดการเติมคำ

สำหรับกรณีทดสอบสำหรับN = 4และM = 13 (สำรับไพ่มาตรฐาน 52 ใบ) คำตอบที่คาดหวังคือ ~ 48.6%

นี่คือตัวอย่างการใช้งานที่ไม่ตีกอล์ฟใน Python + NumPy โดยใช้การสุ่มแบบสุ่ม:

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

เอาต์พุตอาจอยู่ในรูปแบบใด ๆ ที่คุณพบว่าสะดวก (ค่าส่งคืนฟังก์ชั่น, เทอร์มินัลเอาท์พุท, ไฟล์, ฯลฯ ) และอินพุตอาจอยู่ในรูปแบบใดก็ได้ที่คุณสะดวก (พารามิเตอร์ฟังก์ชันอินพุตเทอร์มินัล

ใช้วงมาตรฐานรู

นี่คือรหัสกอล์ฟซึ่งเป็นรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ลีดเดอร์บอร์ด


1
คำวิเศษณ์ที่ไม่ล้อมรอบเป็นเกลียวที่ซับซ้อนหลอกลวง
Sparr

@Sparr คุณให้ความคิดกับฉัน! :-)
Luis Mendo

คำตอบ:


2

Pyth, 23 22 ไบต์

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

วิ่ง 10,000 รอบ จำนวนสามารถเปลี่ยนแปลงได้โดยไม่มีค่าใช้จ่ายไบต์ อินพุตถูกขึ้นบรรทัดใหม่ ใช้เวลาประมาณ 9 วินาทีบนคอมพิวเตอร์ของฉัน

สาธิต

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ไบต์

สิ่งนี้ใช้รุ่น 3.1.0ของภาษาซึ่งเร็วกว่าความท้าทายนี้

การคำนวณเสร็จสิ้นด้วยลูปที่ดึงการสุ่ม 1000 ครั้ง ใช้เวลาสองสามวินาทีในการเรียกใช้ มันสามารถทำได้เร็วกว่าในแบบเวกเตอร์ [N M]การป้อนข้อมูลจะอยู่ในรูป

เวอร์ชันเก่า : สร้างไพ่สุ่มและตรวจสอบสองครั้ง: อันดับแรกในการไปข้างหน้าและจากนั้นในทิศทางย้อนกลับ

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

เวอร์ชันใหม่ : สร้างสำรับไพ่แบบสุ่มจากนั้นต่อท้ายเวอร์ชั่นที่พลิกโดยต่อ0ท้าย วิธีการตรวจสอบสามารถทำได้เพียงครั้งเดียวในทิศทางไปข้างหน้า วิธีนี้ช่วยประหยัดสองไบต์

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

ตัวอย่าง

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

คำอธิบาย

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

LabVIEW, 58 LabVIEW Primitives

creats อาร์เรย์การ์ดแล้วสับพวกเขา ค้นหา 1s จากนั้นตรวจสอบการ์ดที่อยู่ติดกันเป็น 2 วินาที


1

Pyth, 16 ไบต์

JE?>J1-1^-1c2JQZ

สาธิต.

สิ่งนี้ตามมา

  • คาดเดาการศึกษา
  • ตรวจสอบว่ามันใกล้พอ
  • ทำซ้ำ

กลยุทธ์การเขียนโปรแกรม ผู้ชนะที่ได้รับการศึกษาในกรณีนี้คือ

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

ซึ่งประมาณบอกว่ามีโอกาสที่จะตกอยู่ในถังและส่วนของบุ้งกี๋ที่ถูกต้องN 2 / Mถังเป็นช่องวางถัดจาก0s และโอกาสที่จะ1เป็น

ข้อผิดพลาดนั้นดูเหมือนจะไม่เกิน 3% (น่าประหลาดใจ) และดูเหมือนว่าจะรวมกันเป็น 0% เนื่องจากพารามิเตอร์มีขนาดใหญ่ขึ้น (ตามที่ฉันคาดไว้)

อินพุตถูกขึ้นบรรทัดใหม่

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

คุณสามารถบันทึกอักขระถ้าคุณยอมรับความจริงที่ชัดเจนFalse == 0และทำJE&>J1-1^-1c2JQแทน


นี่เป็นครั้งแรกที่ฉันไปที่ Pyth (และคำตอบแรกของฉัน) ดังนั้นคำติชมและความช่วยเหลือก็ยินดีต้อนรับเป็นพิเศษ
Veedrac

1

MATL , 44 38 ไบต์

สิ่งนี้ยังใช้ MATL เวอร์ชัน 3.1.0ซึ่งเร็วกว่าความท้าทายนี้

เวอร์ชันใหม่ต้องขอขอบคุณ Luis Mendo สำหรับการบันทึก 4 ไบต์!

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

รุ่นเก่า (44 ไบต์):

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

คำอธิบาย

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

ตัวอย่างเช่น,

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

หมายเหตุ (21/5/16): ตั้งแต่ MATL รีลีส 18.0.0 X+ถูกลบ แต่Y+สามารถใช้แทน การเปลี่ยนแปลงจาก MATL รุ่น 3.1.0 เพื่อ 18.0.0 หมายถึงการที่คำตอบนี้ขณะนี้คุณสามารถเขียนได้ในเวลาเพียง 31 *xO1e4:"2:Gtb*Z@w\TT2&Y+1=ah]Ymไบต์


ฉันรู้ว่ามีคำตอบ MATL อยู่แล้ว แต่ฉันคิดว่าวิธีการที่แตกต่างกันมากดังนั้นฉันยังคงโพสต์นี้
David

ฉันชอบการโน้มน้าวใจ!
Luis Mendo

คุณสามารถบันทึกเล็ก ๆ น้อย ๆ การเปลี่ยนแปลงเข้าสู่[1 1] TToนอกจากนี้คุณไม่จำเป็นต้องใช้เครื่องหมายจุลภาค
Luis Mendo ใน

@ LuisMendo ขอบคุณ! ฉันคิดว่าต้องมีวิธีที่ดีกว่าในการทำเช่นนั้น!
David

ตอนนี้ฉันเห็นวิธีการทำงานของ Convolution ที่นี่ การใช้การตั้งชื่อการ์ดแบบ 0 นั้นฉลาดมาก!
Luis Mendo

0

Mathematica, 93 92 91 ไบต์

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

ยังคงมองหารูปแบบปิด ...


มันจะเกี่ยวข้องกับการคำนวณการเรียงสับเปลี่ยนวนซ้อนกัน
Sparr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.