AnyDice Help: ORE-Like Resolution

5

Jag letar efter hjälp med att skapa ett AnyDice-program som kan beräkna möjligheterna för följande mekaniker.

Spelare rulle ett antal d6, fortsätt sedan summa alla tärningar av en enda uppsättning matchande tärningar.

Sålunda ...

... en rulle med 3, 3, 5, 5, 6 skulle generera ett poäng på 10 (5 + 5).

... en rulle med 1, 1, 2, 2, 4 skulle generera en poäng på 4 (2 + 2).

Om ingen matchande uppsättning rullas, betraktas den högsta stolen en uppsättning.

Sålunda ...

... en rulle med 1, 2, 3, 4, 5 skulle generera ett poäng på 5 (5).

Företrädesvis bör programmet mata ut [mekaniker] > = [mekaniker].

Tack.

    
uppsättning RavenStag 06.06.2015 02:17

5 svar

4

Redigerad med hjälp av Ilmari Karonen råd.

Du behöver bara göra N det antal rullade döden.

Använd länken eller kopiera koden själv.

391.133     
svaret ges 08.06.2015 21:52
2

Här är en enklare AnyDice-lösning , ursprungligen baserat på Albert Masclans kod , men nästan helt omskrivet:

391.133

Du kan ändra 5d6 på sista raden till allt du vill ha. Stora dörrpooler kommer emellertid sannolikt att gå ut, eftersom koden fungerar genom att det blivit iterating över varje möjlig roll (det är vad som händer i AnyDice när du skickar en dörr till en funktion som förväntar sig en sekvens), och det blir snabbt alltför långsamt.

För lite större tärningspoolar, här är ett Python-program som gör samma beräkning:

391.133

Funktionen dice_pool(n, d) som utgör det mesta av koden är i själva verket ett allmänt ändamålsenligt verktyg för beräkning av sannolikheter som involverar oordnade tärningspottar. Det är en generator som successivt returnerar varje rulle (i form ((1, n1), (2, n2), (3, n3), ...) , där n1 , n2 , n3 etc. är antalet tärningar som rullade 1, 2, 3, etc.) och sannolikheten att erhålla den rollen. (Ja, det uppkomna värdet är en tuple som innehåller en tuple tuples. Det är helt naturligt att använda.)

För hastighet har jag valt att använda floats för sannolikhetsberäkningarna, trots att det finns små avrundningsfel. Det skulle vara möjligt att få exakta resultat genom att använda heltal / rationell matematik överallt, men vinsten skulle sannolikt vara minimal, eftersom det inte skulle finnas några reella möjligheter till katastrofal avbokning här. Det finns också några andra optimeringar, som förberäknar faktorialerna av siffror från 0 till N. Med optimeringarna tar beräkningen av sannolikheten för 20d6 ca 0,8 sekunder på min gamla bärbara dator, medan 50d6 tar ungefär 47 sekunder.

    
svaret ges 29.07.2015 12:39
1

Jag kan inte göra det i AnyDice, men det är inte så svårt att koda i Python ...

I Python

391.133

Utöka detta

res måste ha minst lika många 0 värden som 1+ (sidor * nummer).

Varje matris får ett separat värde, men du kan genväga detta genom att definiera en matris som en variabel och ersätta arrayerna för individuell matris för uttalanden med den angivna matrisen.

Blocket work måste vara inrymmt ihop. Python är beroende av vitrymden.

För att lägga till en matris: lägg till ytterligare for rad med ett annat brev, lägg till ytterligare 0 i matrisen work , lägg till ytterligare work[ ] = rad med nästa sekventiella nummer och den nya matrisens variabel.

Du kan inte genväga och bara ladda work direkt i for -förklaringarna, eftersom sorteringsrutinen skulle skruva upp redovisningen.

Utgången är i resultatvärde, antal förekomster och permille resultat (procentandel * 10). Om du vill ha fler platser, öka multiplikatorn i print -raden.

Tweaking tärningsvärdena

Om du vill spela runt med några funky resultat, till exempel byta rullar med 1 med 0 (så 1: s räkning som ingenting), ersätt bara de 1 i raderna i linjerna. Så arraysna skulle vara [0,2,3,4,5,6] .

Du byter till d8 genom att använda [1,2,3,4,5,6,7,8] .

Det är lite ädelare att koda för OREs 2-d-resultat (bredd och höjd), men eftersom du inte frågade om det ... okej, jag ska också diskutera det också.

Och det beror på att en sann ORE-rulle har frågan om huruvida man prioriterar höjden (värdet av antalet räknat) eller bredd (antal replikeringar i rullen).

Om man prioriterar den ena eller den andra är det lätt att räkna ut. Annars måste man kryssa de olika uppställningsplatserna som är möjliga på ett 2d-nät. Summan av inmatningarna skulle således vara mer än antalet iterationer.

Det här är inte särskilt snabb kod. (Python är inte särskilt snabb, och det här är inte optimerad kod.) Men det var tillräckligt bra för att du behöll det under 8 tärningar eller så, och dessa tärningar är alla under d12.

Ovanstående kod © 2015 William F. Hostman. Tillstånd att kopiera och använda för alla tillåtna rättsliga ändamål, inklusive inkludering i texter, förutsatt att tillskrivning ges. Koden tog 10 minuter att skriva. Tog så länge eller längre med att kommentera det.

    
svaret ges 07.06.2015 00:30
1

Inte riktigt säker på varför mrlemons svar blev nedvotat, eftersom jag hade samma lutning. I mitt fall ville jag dock använda några av de nyare artiklarna i Python3-standardbiblioteket för att göra den koden ganska enklare:

391.133     
svaret ges 11.03.2017 22:59
0

Efter att ha läst aramis 'mycket långa svar (inget brott), kunde jag inte låta bli att golfen python ner i en snygg funktion. Den här använder statistik för enkelhet, istället för att faktiskt beräkna sannolikheterna, men det fungerar ganska bra som en uppskattning.

391.133

(tog mig längre än 10 minuter också.)

    
svaret ges 11.06.2015 19:07