Вірогідність пари карт


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 Ви дали мені ідею! :-)
Луїс Мендо

Відповіді:


2

Pyth, 23 22 байти

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

Виконує 10000 ітерацій. Число можна змінити без витрат на байт. Введення розділено новим рядком. На моєму комп’ютері займає близько 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 Primitive

масиви карт Creats потім переміщують їх. Шукайте 1, потім перевірте сусідні картки на 2 секунди.


1

Pyth, 16 байт

JE?>J1-1^-1c2JQZ

Демонстрація.

З цього випливає

  • зробити здогадку,
  • перевірте, чи достатньо близько,
  • повторити

стратегія програмування. Виграна здобута здогадка в цьому випадку така

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

що приблизно говорить про те, що є Nшанси потрапити у відра, і частка дійсних відра є 2 / M. Відра, що є слотами, розташовуються поруч із 0s, а шанси бути 1s.

Здається, помилка ніколи не перевищує 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 (і моя перша відповідь), тому критика та допомога особливо вітаються.
Ведрак

1

MATL , 44 38 байт

Для цього також використовується версія MATL версії 3.1.0 , яка є раніше, ніж ця проблема.

Нова версія, завдяки Луїсу Мендо за збереження 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 вже є, але я думаю, що методи зовсім інші, тому я все-таки розмістив цю.
Девід

Я люблю згортання!
Луїс Мендо

Ви можете заощадити трохи змінюється [1 1]в TTo. Також вам не потрібна кома
Луїс Мендо

@LuisMendo дякую! Я думав, що, мабуть, був кращий спосіб зробити це!
Девід

Тепер я бачу, як працює тут згортка. Використання найменувань карток на основі 0 було дуже розумним!
Луїс Мендо

0

Математика, 93 92 91 байт

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

Ще шукає закриту форму ...


це буде включати вкладений цикл обчислень перестановки.
Спарр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.