Modell motsatta tärningspooler med byte

5

Jag har ett tärningssystem som tilldelar till exempel skador på förloraren av en motsatt roll. Spelare rulla sin tärningspool, där varje spelares målnummer är det högsta numret som rullas av motståndaren. Varje rulle över eller lika med målet räknas som en framgång. Spelare jämför sedan deras antal framgångar och förloraren tar skillnaden som skada.

Om spelarna har ett lika stort antal framgångar, vinner spelaren med högsta tärningsserien 1 poäng och skadar förloraren. (Med början med högsta dö, kastar spelarna matchande tärningar tills en av spelarna har en högre dö.)

Jag har modellerat detta i AnyDice sålunda: Brawl Dice

391.133

Allt bra och bra, men min fråga är:

Hur skulle jag modellera en liknande situation men med spelare A att kunna byta sin lägsta tärning för spelare B: s högsta?

Om någon vet hur jag kan optimera ovanstående kod skulle det uppskattas. För närvarande är jag begränsad till ganska små pooler.

Exempel # 1:

Player A rolls: 4,3,3,2,1
Player B rolls: 4,4,2,2,2

Player A swaps dice, exchanges his 1 result for Player B's 4 result.
Player A's final pool: 4,4,3,3,2
Player B's final pool: 4,2,2,2,1

Both players' target number is 4 (taken as the highest value of the other player's pool).
Player A has two successes.
Player B has one success.
Player B takes one "damage".

Exempel # 2:

Player A rolls: 4,3,3,2,1
Player B rolls: 6,4,2,2,2

Player A swaps dice, exchanges his 1 result for Player B's 6 result.
Player A's final pool: 6,4,3,3,2
player B's final pool: 4,2,2,2,1

Player A's target number is 4 (2 successes).
Player B's target number is 6 (0 successes).

Player B takes two "damage".

Exempel # 3:

Player A rolls: 4,3,2,2,1
Player B rolls: 4,4,4,3,1

Player A swaps dice, exchanges his 1 result for Player B's 4 result.
Player A's final pool: 4,4,3,2,2
Player B's final pool: 4,4,3,1,1

Player A's target number is 4 (2 successes).
Player B's target number is 4 (2 successes).

Tiebreak!
Player A: 4,4,3,2,2
Player B: 4,4,3,1,1
Player A wins the tiebreak awarding 1 damage to player B.

Om det finns en Troll-lösning skulle det också vara acceptabelt. Jag har aldrig använt Troll tidigare men jag tror att jag borde kunna hämta det.

Jag har lyckats komma till samma plats med Troll som med AnyDice-koden ovan, men jag sitter fast vid genomförandet av bytesmekanikern. : (

391.133     
uppsättning Doug 03.01.2018 14:43

3 svar

2

Här är en enkel "brute force" AnyDice-lösning till ditt problem:

391.133

Funktionen [brawl A vs B] gör exakt samma sak som i din ursprungliga kod (även om jag tweaked det något), medan hjälpen [set element I in SEQ to N] är från detta svar . Den nya [brawl A vs B with optional swap] -funktionen kallar bara den första funktionen två gånger, en gång med den nedre A-tröskeln byttes med den högsta die av B och en gång utan, och återkommer det bättre resultatet av de två.

Det fina med detta tillvägagångssätt är att vi faktiskt inte behöver bestämma exakt när det är fördelaktigt för A att byta tärningarna. Allt vi behöver anta är att med den faktiska rullade tärningen på bordet är spelare A smart att göra matematiken och ta reda på om byte gör deras poäng bättre eller sämre.

Det visar sig emellertid att i det här fallet är den optimala strategin ganska enkel: A ska byta sin lägsta dysrulle med B: s högsta om och endast om den är mindre än B: s högsta. (Om de är lika, så byter de dem ingen roll.) Så följande optimerade funktion kommer faktiskt att ge samma resultat i det här fallet:

391.133

Ps. Som ett alternativ, här är ett Python-program som beräknar samma sak , med hjälp av (en något modifierad version av) tärningspoolgeneratorn från detta svar :

391.133

I motsats till A.B.s stokastiska simulering beräknar den här koden faktiskt de exakta sannolikheterna (väl, exakt upp till noggrannhet i flytpunkten) av de olika resultaten direkt genom att räkna upp alla möjliga tärningsrullar och deras sannolikheter, precis som AnyDice gör. Det är ganska lite snabbare än AnyDice dock med 3D6 kontra 3D6 fall tar bara cirka 0,1 sekunder och 4D6 vs. 4D6 tar endast 0,25 sekunder på TIO-servern

    
svaret ges 07.01.2018 09:27
1

Om man antar att båda spelarna spelar optimalt och om jag förstod din förklaring, kan du använda den här koden för att hitta sannolikheten för vissa resultat beroende på variabler som tärningar som används och antal tärningar som rullas för varje spelare.

Länken ovan kan du ange olika inmatningar för dessa variabler såväl som antalet iterationer. Det är vanligt att använda en d6 med 5 tärningar per spelare pool och 100 000 iterationer.

391.133

Det är skrivet i Python eftersom jag inte är bekant med AnyDice.

    
svaret ges 03.01.2018 18:04
1

Torben skapare av Troll Dice har gärna svaret:

391.133     
svaret ges 05.01.2018 10:26