Jag har studerat och lekat med många udda tärningssystem ett tag nu, och Anydice har varit en stor hjälp för att förstå sannolikhetseffekterna av olika system. Jag har dock stött på en som, medan jag är rolig i praktiken, inte har kunnat modellera i Anydice för att bättre förstå dess kurvor.
Ett exempelutgång kan beskrivas som
Högsta 2 av 2d6 och 3d8
men Anydice känner inte igen den här syntaxen. Jag hittade en liknande fråga från ungefär ett år sedan med några bra svar, men den personen försökte bara hitta det högsta enskilda resultatet, medan jag behöver de högsta två resultaten av en oregelbunden tärningspool.
Systemet är en kombination av rulle och håller med steg terning, med steg terning för attribut och antal tärningar rullade, alltid hålla 2, för färdigheter. Attributen ökar ojämnt, så poolen består antingen av endast d6, en blandning av d6 och d8, eller endast d8. När det gäller en blandad pool tar varje typ av tärningar upp hälften av det och avrundar till förmån för den större matrisen om din pool är udda.
Jag kan räkna ut hur man slår variablerna själv, men när jag kan hitta ett sätt att ordna nämnda variabler.
Det här är faktiskt ganska enkelt att implementera i AnyDice :
391.133Dessa funktioner förutsätter att du inte har ändrat sorteringsordningen, som är högst till lägsta som standard. Om du vrider den, börjar den "högsta" funktionen återföra de lägsta rullarna och vice versa.
Du kan också enkelt ändra dessa funktioner för att hantera mer än två typer av tärningar, som i:
391.133 Nu för de dåliga nyheterna: Dessa funktioner kan få mycket långsamt för stora tärningspooler, eftersom de räknar upp alla möjliga rullar med brute force. De inbyggda "högsta / lägsta N av DICE " -funktionerna optimeras med smart matematik för att springa mycket snabbt även för ett stort antal tärningar, men de är inte. Om du försöker beräkna något som [highest 2 of 10d6 and 10d8]
med dessa funktioner får du nästan säkert ett time-out-fel.
Det är också värt att notera att, precis som inbyggda, returnerar dessa funktioner en singel förspänd dö som beskriver summan för högsta / lägsta N värden. Således är exempelvis [highest 1 of [highest 2 of 1d6 and 1d8]]
inte detsamma som [highest 1 of 1d6 and 1d8]
! Såvitt jag vet, kombinerar jag egentligen en d6 och en d8 till en enda tärningspool i AnyDice är helt enkelt inte möjligt; du kan ha förspända tärningar som representerar vilken sannolikhetsdistribution du vill ha, och du kan ha pooler med flera identiska tärningar, men du kan inte ha olika typer av tärningar i samma pool.
På plussidan, till skillnad från inbyggda insatser, fungerar dessa funktioner "som förväntat" också för sekvensingångar: till exempel returnerar [highest 2 of {1,2} and {3,4}]
7 = 3 + 4 som förväntat, inte 10 = 1 + 2 + 3 + 4 som motsvarande inbyggda [highest 2 of {1,2,3,4}]
skulle (!). (Det här händer eftersom de inbyggda är definierade för att dö som deras ingång, inte en sekvens, och så kommer AnyDice automatiskt att konvertera en sekvens till en dö genom att summera dess värden innan funktionen ens ser det. Jag tycker om att en bugg i AnyDice, även om det fungerar tekniskt exakt som dokumenterat.)
Baserat på Tims och Trishs ursprungliga svar, jag har konstruerat detta monster som, som de flesta av mina program, gör stor nytta av AnyDice-parametergjutning / -reaktion för att hantera den tråkiga processen att konstruera och använda tärningar med funktioner:
391.133 output
-förklaringarna ger en viss uppfattning om dess användning, tillsammans med testfall för att visa olika rullar som denna kod gör och matchar inte. För allmän användning ska du använda [highest N of P skill S]
. Passa nummeret du vill behålla, dö pool storlek (totalt, båda storlekarna tillsammans) och skicklighet . "Skicklighet" betyder den genomsnittliga dysstorleken på din pool, som kan vara ett udda nummer och kommer då att sorteras ut för att ha hälften av poolen (rundad upp) med nästa större jämnsidiga dö , och resten med hjälp av nästa mindre jämnsidiga matris. Så en färdighet på 9 blir en pool som är ungefär hälften d10s och resten d8s. (Inget försök görs för att förhindra dig från att rulla galna storlekar, till exempel 2d14 + 3d16, men matematiken skulle kolla om du ville rulla de konstiga tärningarna ändå.)
Kontrollera resultaten, växa med ökande pool och hållna storlekar, vilket förväntas gränser hålls till den faktiska tillgängliga tärningen (så [highest 2 of 3 skill 7]
hamnar med d8 och en av d6s mestadels men har ingen sekund d8 runt), men annars är det lika stort som det kvarhållna antalet rullade tärningar av den större döden storlek. Och visuellt tenderar topparna att uppvisa "bunkar" -kännetecknet för de bästa N-arrangemangen, tillsammans med skevningen från olika dörrpooler. Så jag tror att detta är allt korrekt.
.
Efter att ha fiddling runt med anydice i flera timmar och gick igenom ett helt falskt resultat, fick jag äntligen följande kod . Det berättar hur ofta varje nummer inträffar på kombinationen:
391.133Men det är ännu inte räknat ut och ganska användarvänlig. Så mer fiddling resulterade i detta:
391.133Detta berättar åtminstone hur många av dessa fall är 1 eller 2 av dem. Vi har inget intresse för fall där 3 eller mer av ett givet resultat dyker upp, eftersom dessa extras måste ignoreras. Ändå ger det oss bara slätten "en eller två gånger" och "dubbelt samma" sannolikheter, inte sannolikheterna för de högsta två av uppsättningen.
Nu fungerar det inte klart ännu.
Men här följer sekvenser: Anydice kan göra sekvenser, så vi kan göra en sekvens av NdX och MdY, det är en enda sträng som innehåller alla dessa nummer. Den hanterar nästan som en dö, men är inte en.
391.133Denna sekvens kan inte användas som en dö som den är, vi måste göra den till en. För att göra det låter vi att det är en N-sidig super-die (där N längd av sekvensen) som är märkt på samma sätt som sekvensen, så i vårt exempel 5x1, 5x2, ..., 5x6, 3x7, 3x8. Den enkla delen är att vi bara behöver lägga till en "d" framför sekvensen och få en dö.
För att få det slutliga resultatet av högst två av en rulluppsättning behöver vi bara rulla ett antal av dessa imaginära super-tärningar som är lika med det totala antalet riktiga tärningar som vi kastade in i super-tärningen.
391.133För testfallet NONE: 0, med någon NTWO, håller den rätt resultat, så här är vi stängande in på Home Stretch! Detta har fortfarande vissa fel: för NONE: 1 NTOW: 1 koden tillåter 15 och 16, vilket inte borde vara. Det fallet är faktiskt det högsta av 1d6 och 1d8, tar alltid båda. Vi kan inte ha 2d6 och 1d8 som utgångspunkt. För 2d6 faller vi tillbaka till det enkla fallet med att hålla båda, så vi behöver en att kontrollera vissa fall separat för att fixa resultaten.
Falldifferentiering för NTWO = 0, 1 och mer fixar de felaktiga resultaten i de låga regionerna:
391.133Lösningen ger i bästa fall en mycket bra approximation, men som Ilmari påpekades:
[Y]ou're effectively defining a hybrid die that behaves like a d6 with probability N1/(N1+N2) and like a d8 with probability N2/(N1+N2), and then making N1+N2 independent rolls of that die. Thus, while the dice pool you're rolling will have an average of N1 d6's and N2 d8's, you also end up counting cases where the composition of the pool differs from the average
EDIT: Efter att ha läst Trishs kommentar om hur dansen behöver rullas så ofta som det finns tärningar i poolen undrade jag om följande skulle faktiskt fungera:
391.133Det ser ut att det här är det enklaste sättet att göra det? Jag får en fin bellkurva med detta tredje försök.
Läs andra frågor om taggar game-design anydice Kärlek och kompatibilitet Skor Gear 12 Stjärntecken Grunderna