Формула для расчета экзотических ставок, таких как Trifecta и Superfecta - PullRequest
3 голосов
/ 11 июля 2009

Я пытаюсь создать приложение, которое будет рассчитывать стоимость экзотических пари пари. Я нашел несколько для определенных типов ставок, но ни одной, которая не решает все сценарии для одного типа ставок. Если бы я мог найти алгоритм, который мог бы рассчитать все возможные комбинации, я бы использовал эту формулу для решения других моих проблем.

Дополнительная информация: Мне нужно рассчитать перестановки групп чисел. Например;

Группа 1 = 1,2,3
Группа 2 = 2,3,4
Группа 3 = 3,4,5

Каковы все возможные перестановки для этих 3 групп чисел, берущих 1 число от каждой группы за перестановку. Нет повторений на перестановку, что означает, что число не может появляться более чем в 1 позиции. Таким образом, 2,4,3 действителен, но 2,4,4 недействителен.

Спасибо за помощь.

Ответы [ 5 ]

4 голосов
/ 22 июля 2009

Как и большинство интересных проблем, у вашего вопроса есть несколько решений. Алгоритм, который я написал (ниже) - самая простая вещь, которая пришла мне в голову.

Мне было проще представить проблему как поиск по дереву: в первой группе, корне, есть дочерний элемент для каждого числа, которое он содержит, где каждый дочерний элемент является второй группой. Вторая группа имеет дочерний элемент третьей группы для каждого содержащегося в ней числа, третья группа имеет дочерний элемент четвертой группы для каждого содержащегося в нем номера и т. Д. Все, что вам нужно сделать, - это найти все допустимые пути от корня до листьев.

Однако для многих групп с большим числом чисел этот подход окажется медленным без какой-либо эвристики. Одна вещь, которую вы можете сделать, это отсортировать список групп по размеру группы, сначала по наименьшей группе. Это был бы отказоустойчивый подход, который, как правило, обнаружил бы, что перестановка не действительна раньше, чем позже. Заблаговременность, согласованность дуг и обратный ход - это другие вещи, о которых вы можете подумать. [Извините, я могу включить только одну ссылку, потому что это мой первый пост, но вы можете найти эти вещи в Википедии.]

## Algorithm written in Python ##
## CodePad.org has a Python interpreter

Group1 = [1,2,3] ## Within itself, each group must be composed of unique numbers
Group2 = [2,3,4]
Group3 = [3,4,5]
Groups = [Group1,Group2,Group3] ## Must contain at least one Group

Permutations = [] ## List of valid permutations

def getPermutations(group, permSoFar, nextGroupIndex):
  for num in group:
    nextPermSoFar = list(permSoFar) ## Make a copy of the permSoFar list

    ## Only proceed if num isn't a repeat in nextPermSoFar
    if nextPermSoFar.count(num) == 0: 
      nextPermSoFar.append(num)  ## Add num to this copy of nextPermSoFar

      if nextGroupIndex != len(Groups): ## Call next group if there is one...
        getPermutations(Groups[nextGroupIndex], nextPermSoFar, nextGroupIndex + 1)
      else: ## ...or add the valid permutation to the list of permutations
        Permutations.append(nextPermSoFar)

## Call getPermutations with:
##  * the first group from the list of Groups
##  * an empty list
##  * the index of the second group
getPermutations(Groups[0], [], 1)

## print results of getPermutations
print 'There are', len(Permutations), 'valid permutations:'
print Permutations
1 голос
/ 24 июля 2014

Это самая простая общая формула, которую я знаю для trifectas.

A = количество выбранных вами вариантов; B = количество выборов за секунду; C = количество выборов для третьего; AB = количество выбранных вами вариантов как в первом, так и во втором; AC = нет. как для первого, так и для третьего; BC = нет. для 2-го и 3-го; и ABC = нет. из выборов для всех 1, 2 и 3. формула (АхВхС) - (ABxC) - (ACxB) - (BCxA) + (2xABC)

Итак, для вашего примера ::

 Group 1 = 1,2,3
 Group 2 = 2,3,4
 Group 3 = 3,4,5

решение: :: (3x3x3) - (2x3) - (1x3) - (2x3) + (2x1) = 14. надеюсь, это поможет Там может быть более простой метод, который я не знаю. Кто-нибудь знает общую формулу для First4?

1 голос
/ 24 января 2011

Пересмотрено через несколько лет: -

Через некоторое время я снова вошел в свою учетную запись SE, заметил этот вопрос и понял, что написанное мною даже не ответило вам: -

Вот код Python

import itertools
def explode(value, unique):
    legs = [ leg.split(',') for leg in value.split('/') ]
    if unique:
        return [ tuple(ea) for ea in itertools.product(*legs) if len(ea) == len(set(ea)) ]
    else:
        return [ tuple(ea) for ea in itertools.product(*legs) ]

вызов разнесения работает на том основании, что каждая нога отделяется /, а каждая позиция -,

для расчета trifecta вы можете рассчитать его следующим образом: -

result = explode('1,2,3/2,3,4/3,4,5', True)
stake = 2.0
cost = stake * len(result)
print cost

для суперфекта

result = explode('1,2,3/2,4,5/1,3,6,9/2,3,7,9', True)
stake = 2.0
cost = stake * len(result)
print cost

для pick4 (установить уникальное значение на False)

result = explode('1,2,3/2,4,5/3,9/2,3,4', False)
stake = 2.0
cost = stake * len(result)
print cost

Надеюсь, это поможет

0 голосов
/ 20 июля 2017

Ответ, предоставленный Лускиным, верен для trifectas. Он задал еще один вопрос, который мне нужно было решить в отношении First4. Я посмотрел везде, но не смог найти формулу. Однако я нашел простой способ определить количество уникальных перестановок, используя вложенные циклы для исключения повторяющихся последовательностей.

    Public Function fnFirst4PermCount(arFirst, arSecond, arThird, arFourth) As Integer


Dim intCountFirst As Integer
Dim intCountSecond As Integer
Dim intCountThird As Integer
Dim intCountFourth As Integer
Dim intBetCount As Integer

'Dim arFirst(3) As Integer
'Dim arSecond(3) As Integer
'Dim arThird(3) As Integer
'Dim arFourth(3) As Integer

'arFirst(0) = 1
'arFirst(1) = 2
'arFirst(2) = 3
'arFirst(3) = 4
'
'arSecond(0) = 1
'arSecond(1) = 2
'arSecond(2) = 3
'arSecond(3) = 4
'
'arThird(0) = 1
'arThird(1) = 2
'arThird(2) = 3
'arThird(3) = 4
'
'arFourth(0) = 1
'arFourth(1) = 2
'arFourth(2) = 3
'arFourth(3) = 4

intBetCount = 0
For intCountFirst = 0 To UBound(arFirst)
    For intCountSecond = 0 To UBound(arSecond)
        For intCountThird = 0 To UBound(arThird)
            For intCountFourth = 0 To UBound(arFourth)
                If (arFirst(intCountFirst) <> arSecond(intCountSecond)) And (arFirst(intCountFirst) <> arThird(intCountThird)) And (arFirst(intCountFirst) <> arFourth(intCountFourth)) Then
                    If (arSecond(intCountSecond) <> arThird(intCountThird)) And (arSecond(intCountSecond) <> arFourth(intCountFourth)) Then
                        If (arThird(intCountThird) <> arFourth(intCountFourth)) Then
                        '    Debug.Print "First " & arFirst(intCountFirst), " Second " & arSecond(intCountSecond), "Third " & arThird(intCountThird), " Fourth " & arFourth(intCountFourth)
                            intBetCount = intBetCount + 1
                        End If
                    End If
                End If
            Next intCountFourth
        Next intCountThird
    Next intCountSecond
Next intCountFirst
fnFirst4PermCount = intBetCount

End Function

эта функция принимает четыре строковых массива для каждой позиции. Я оставил в тестовом коде (закомментированный), чтобы вы могли видеть, как он работает для 1/2/3/4 для каждой из четырех позиций

0 голосов
/ 21 апреля 2010

Как игрок, я могу сказать вам, что есть гораздо более простой способ:

Для trifecta вам нужно 3 комбинации. Скажем, есть 8 бегунов, общее количество возможных перестановок составляет 8 (всего бегунов) * 7 (оставшиеся бегуны после победителя опущены) * 6 (оставшиеся бегуны после победителя и 2-й опущены) = 336

Для точных (с 8 бегунами) 8 * 7 = 56

Квинеллы - исключение, так как вам нужно принимать каждую ставку только один раз как 1/2, а также 2/1, поэтому ответ 8 * 7/2 = 28

Simple

...