そのような連勝単式とSuperfectaようなエキゾチックな賭けを計算するための式

StackOverflow https://stackoverflow.com/questions/1112195

  •  12-09-2019
  •  | 
  •  

質問

私はエキゾチックなパリミューチュエル方式の賭け費のコストを計算するアプリケーションを作成しようとしています。私はシングルベットタイプのすべてのシナリオを解決賭け、特定のタイプのためのいくつかが、決して1を発見しました。私はすべての可能な組み合わせを計算することができるアルゴリズムを見つけることができれば、私は私の他の問題を解決するために、式を使用することができます。

その他の情報: 私は数字のグループの順列を計算する必要があります。例えば;

グループ1 = 1,2,3
グループ2 = 2,3,4
グループ3 = 3,4,5

順列ごとに各グループから1つの番号を取って数字のこれらの3つのグループのために可能なすべての順列は何ですか。数を意味順列あたりませリピートは、よりその1位には表示されませんすることはできません。だから、2,4,3は有効ですが、2,4,4は有効ではありません。

すべての助けをありがとうます。

役に立ちましたか?

解決

最も興味深い問題のように、あなたの質問には、いくつかのソリューションを提供しています。私は(下記)を書いたアルゴリズムが頭に浮かんだの最も簡単なものです。

私はそれが最も簡単なツリー検索のような問題を考えることが見つかりました:最初のグループを、根は、それぞれの子は、第二のグループで、それに含まれる各番号、の子を持っています。第2のグループは、それに含まれる各番号の3群の子供を持っている、第三のグループは、それが含まれている各番号などのための4群の子を持っているあなたがしなければならないのは、葉へのルートからすべての有効なパスを見つけることです。

ただし、数字の多くが付いている多くのグループのために、このアプローチは、任意のヒューリスティックせずに遅くなることを証明します。あなたができることの一つは、最初のグループ・サイズ、最小グループによってグループのリストを並べ替えています。これは、一般的には、順列は遅かれ早かれよりも有効ではないことを発見するでしょうフェイルファストのアプローチになります。ルックアヘッド、アーク整合性に、そしてバックトラックは、あなたが考えるようにしたいかもしれない他のものです。 [申し訳ありませんが、それは私の最初の投稿ですので、私は1つのリンクのみを含めることができますが、Wikipediaのこれらの事を見つけることができます。

## 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

他のヒント

このはtrifectasのため、私が知っている最も簡単な一般式である。

A =あなたが最初のために持っている選択肢の数。 B =第二のための選択の数。 C =第三のための選択肢の数。 AB =あなたが第一及び第二の両方を持っている選択肢の数。 AC =がありません。第一及び第三の両方のために、 BC =なし。第2、第3の両方のために。そして、ABCはありませんを=。第一、第二、第三のすべてのための選択の。 式は     (AxBxC) - (ABxC) - (ACxB) - (BCXA)+(2xABC)

だから、あなた例えば::

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

溶液は::(3×3×3) - (2×3) - (1×3) - (2×3)+(2×1)= 14。役に立つといいですが。 私は知りません簡単にする方法があるかもしれません。今、誰もがFirst4のための一般式を知っていますか?

数年後に改訂: -

私はしばらく私のSEのアカウントにログインしてこの問題に気づいた、とさえあなたを答えなかった私が書いた実現RE: -

ここではいくつかの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) ]

各脚が/で区切られ基づいて作品を爆発呼び出すことにより、およびそれぞれの位置、

あなたの三連勝単式の計算のために次のようなことで、それをうまくすることができます: -

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

superfectaのための

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

助け

希望

パンターように私ははるかに簡単な方法があるあなたを伝えることができます

三連勝単式のために、あなたは3の組み合わせを必要としています。 8人のランナーがあると言う、可能な順列の総数は8(全ランナー)である* 7(省略勝者後に残りランナー)* 6(省略勝者と第2の後の残りのランナー)= 336

(8人のランナー付き)連勝単式8×7 = 56

あなたが唯一の1/2がそう答えがあるだけでなく2/1として支払うように一度、各賭けを取る必要があるとして、

Quinellasは、例外では8 * 7/2 = 28

シンプル

luskinによって提供される答えは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

この関数は、各位置のための4つの文字列配列をとります。あなたはそれが4箇所ごとに1/2/3/4のためにどのように動作するかを見ることができますので、私は(コメントアウト)テストコードに残っ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top