Tre Tärningar
Tre Tärningar
Hur ställer jag upp formeln/algoritmen för 3 kastade tärningar där produkten ska bli 24 ?
Sannolikheten blir antalet fall med produkten 24 utav 216 (6x6x6) möjliga varianter.
Antar att formeln blir snarlik om produkten tex ska bli 18.
Sannolikheten blir antalet fall med produkten 24 utav 216 (6x6x6) möjliga varianter.
Antar att formeln blir snarlik om produkten tex ska bli 18.
Re: Tre Tärningar
Jag antar att du menar normala tärningar med värden 1 till 6.
Och med 3 st av sådana är högsta möjliga summa 18 så att slå 24 är en bragd (och fusk).
Och med 3 st av sådana är högsta möjliga summa 18 så att slå 24 är en bragd (och fusk).
Tre Tärningar
Produkten är det som efterfrågas inte summan!
6x6x6=216
Där Produkten = 24
6x2x2=24
4x2x3=24
6x6x6=216
Där Produkten = 24
6x2x2=24
4x2x3=24
Re: Tre Tärningar
Stämmer bra.
Det blir typ tre okända, eller ja delvis okända, variabler.
x*y*z = 24
Om jag vet x och y så går det enkelt att beräkna z.
z = 24/(xy)
Och z kan bara vara 1, 2, 3, 4, 5, 6
Så då kan xy bara bli 24, 12, 8, 6, 4, alltså enbart 5 olika värden då z = 5 inte blir bra.
Så kanske om jag itererar 6 ggr med 24 mod(z), med 1<= z <=6 och sparar heltalsdivisionerna
1, 2, 3, 4 och 6 så ger det xy 24, 12, 8, 6 och 4.
Det kan vara en bra start för en algoritm?
Det blir typ tre okända, eller ja delvis okända, variabler.
x*y*z = 24
Om jag vet x och y så går det enkelt att beräkna z.
z = 24/(xy)
Och z kan bara vara 1, 2, 3, 4, 5, 6
Så då kan xy bara bli 24, 12, 8, 6, 4, alltså enbart 5 olika värden då z = 5 inte blir bra.
Så kanske om jag itererar 6 ggr med 24 mod(z), med 1<= z <=6 och sparar heltalsdivisionerna
1, 2, 3, 4 och 6 så ger det xy 24, 12, 8, 6 och 4.
Det kan vara en bra start för en algoritm?
Re: Tre Tärningar
Så här möjligen...
======================================================================================================
x = 24/(yz)
Och x kan bara vara 1, 2, 3, 4, 5, 6
Så då kan yz bara bli 24, 12, 8, 6, 4, alltså enbart 5 olika värden då x = 5 inte blir bra.
Iterera 6ggr med 24mod(x) => yz 24, 12, 8, 6 och 4
======================================================================================================
y = 24/(xz)
Och y kan bara vara 1, 2, 3, 4, 5, 6
Så då kan xz bara bli 24, 12, 8, 6, 4, alltså enbart 5 olika värden då y = 5 inte blir bra.
Iterera 6ggr med 24mod(y) => xz 24, 12, 8, 6 och 4
=======================================================================================================
z = 24/(xy)
Och z kan bara vara 1, 2, 3, 4, 5, 6
Så då kan xy bara bli 24, 12, 8, 6, 4, alltså enbart 5 olika värden då z = 5 inte blir bra.
Iterera 6ggr med 24mod(z) => xy 24, 12, 8, 6 och 4
=======================================================================================================
Om jag kör igenom varje steg på samma sätt för varje tärning och plockar ut antalet möjligheter.
Varje tärning x, y, z har fått 5 fungerande möjliga värden så om jag summerar
5 + 5 + 5 = 15 så har jag antalet fall som ger 24 ?
======================================================================================================
x = 24/(yz)
Och x kan bara vara 1, 2, 3, 4, 5, 6
Så då kan yz bara bli 24, 12, 8, 6, 4, alltså enbart 5 olika värden då x = 5 inte blir bra.
Iterera 6ggr med 24mod(x) => yz 24, 12, 8, 6 och 4
======================================================================================================
y = 24/(xz)
Och y kan bara vara 1, 2, 3, 4, 5, 6
Så då kan xz bara bli 24, 12, 8, 6, 4, alltså enbart 5 olika värden då y = 5 inte blir bra.
Iterera 6ggr med 24mod(y) => xz 24, 12, 8, 6 och 4
=======================================================================================================
z = 24/(xy)
Och z kan bara vara 1, 2, 3, 4, 5, 6
Så då kan xy bara bli 24, 12, 8, 6, 4, alltså enbart 5 olika värden då z = 5 inte blir bra.
Iterera 6ggr med 24mod(z) => xy 24, 12, 8, 6 och 4
=======================================================================================================
Om jag kör igenom varje steg på samma sätt för varje tärning och plockar ut antalet möjligheter.
Varje tärning x, y, z har fått 5 fungerande möjliga värden så om jag summerar
5 + 5 + 5 = 15 så har jag antalet fall som ger 24 ?
Re: Tre Tärningar
Eftersom det är samma för varje tärning, räcker det med att ta 5*3 ?
Vissa produkter funkar inte tex 21.
7*3 men ingen tärning kan ha 7 olika värden.
Om produkten ska bli 1. Det blir bara 1 fall och
samma med 216. I och för sig 3 möjligheter men
sannolikheten blir 1/216. Då blir sannolikheten för 24 5/216 ? Eller blir det 15/216 ?
Slår jag 2 tärningar med 1 och 1 så kan den tredje bara bli 1 för produkten 1. 1/216.
Slår jag 2 tärningar 1 och 2 och tredje 4 fås 8 men även
1, 4 och 2 ger 8.
Vissa produkter funkar inte tex 21.
7*3 men ingen tärning kan ha 7 olika värden.
Om produkten ska bli 1. Det blir bara 1 fall och
samma med 216. I och för sig 3 möjligheter men
sannolikheten blir 1/216. Då blir sannolikheten för 24 5/216 ? Eller blir det 15/216 ?
Slår jag 2 tärningar med 1 och 1 så kan den tredje bara bli 1 för produkten 1. 1/216.
Slår jag 2 tärningar 1 och 2 och tredje 4 fås 8 men även
1, 4 och 2 ger 8.
Re: Tre Tärningar
Så här verkar bli riktigt men då ska det översättas till en kod också...
Produkten ska bli 72
yz = 72/x
x 1 2 3 4 6
yz 72 36 24 18 12
Ingen tärning kan ha värdet 5.
2 tärningar yz kan ha produkten 36 1 ggr
2 tärningar yz kan ha produkten 24 2 ggr
2 tärningar yz kan ha produkten 18 2 ggr
2 tärningar yz kan ha produkten 12 4 ggr
2*36 1 ggr
3*24 2 ggr
4*18 2 ggr
6*12 4 ggr
1 + 2 + 2 + 4 = 9
===================================================================
Ett exempel till, produkten ska bli 60
yz = 60/x
x 1 2 3 4 5 6
yz 60 30 20 15 12 10
2 tärningar yz kan ha produkten 30 2 ggr
2 tärningar yz kan ha produkten 20 2 ggr
2 tärningar yz kan ha produkten 15 2 ggr
2 tärningar yz kan ha produkten 12 4 ggr
2 tärningar yz kan ha produkten 10 2 ggr
2 + 2 + 2 + 4 + 2 = 12
===================================================================
Produkten ska bli 4
yz = 4/x
x 1 2 3 4 5 6
yz 4 2 - 1 - -
2 tärningar yz kan ha produkten 4 3 ggr
2 tärningar yz kan ha produkten 2 2 ggr
2 tärningar yz kan ha produkten 1 1 ggr
1*4 3 ggr
2*2 2 ggr
4*1 1 ggr
3 + 2 + 1 = 6
Produkten ska bli 72
yz = 72/x
x 1 2 3 4 6
yz 72 36 24 18 12
Ingen tärning kan ha värdet 5.
2 tärningar yz kan ha produkten 36 1 ggr
2 tärningar yz kan ha produkten 24 2 ggr
2 tärningar yz kan ha produkten 18 2 ggr
2 tärningar yz kan ha produkten 12 4 ggr
2*36 1 ggr
3*24 2 ggr
4*18 2 ggr
6*12 4 ggr
1 + 2 + 2 + 4 = 9
===================================================================
Ett exempel till, produkten ska bli 60
yz = 60/x
x 1 2 3 4 5 6
yz 60 30 20 15 12 10
2 tärningar yz kan ha produkten 30 2 ggr
2 tärningar yz kan ha produkten 20 2 ggr
2 tärningar yz kan ha produkten 15 2 ggr
2 tärningar yz kan ha produkten 12 4 ggr
2 tärningar yz kan ha produkten 10 2 ggr
2 + 2 + 2 + 4 + 2 = 12
===================================================================
Produkten ska bli 4
yz = 4/x
x 1 2 3 4 5 6
yz 4 2 - 1 - -
2 tärningar yz kan ha produkten 4 3 ggr
2 tärningar yz kan ha produkten 2 2 ggr
2 tärningar yz kan ha produkten 1 1 ggr
1*4 3 ggr
2*2 2 ggr
4*1 1 ggr
3 + 2 + 1 = 6
Re: Tre Tärningar
Proceduren skulle kunna se ut så här
1. Lista alla produkter för 2st tärningar med tillhörande multipel
Ex.
36 1
30 2
25 1
24 2
20 2
18 2
16 1
15 2
12 4
2. Ta reda på vilka tärningsvärden hos tärning 3 som ger
jämt delbara värden med det önskade talet och lista dessa
tillsammans med sin multipel.
Ex.
72 0
36 1
24 2
18 2
12 4
3. Summera multiplarna som 2 tärningar kan ge: 1 + 2 + 2 + 4 = 9
1. Lista alla produkter för 2st tärningar med tillhörande multipel
Ex.
36 1
30 2
25 1
24 2
20 2
18 2
16 1
15 2
12 4
2. Ta reda på vilka tärningsvärden hos tärning 3 som ger
jämt delbara värden med det önskade talet och lista dessa
tillsammans med sin multipel.
Ex.
72 0
36 1
24 2
18 2
12 4
3. Summera multiplarna som 2 tärningar kan ge: 1 + 2 + 2 + 4 = 9
Re: Tre Tärningar
Vill jag åt sannolikheten blir det samtliga kombinationer som måste tas med. Att få 72 blir 9/216.
12 och 24 verkar finnas flest av.
24 också ett klocktal!
12 och 24 verkar finnas flest av.
24 också ett klocktal!
Re: Tre Tärningar
Lade in värden i ett kalkylark.
Översta rutan är kombinationer för 2 tärningar och
de gula är för den 3:dje tärningen med stigande värde.
Nu ser man tydligt hur det hänger ihop!
Översta rutan är kombinationer för 2 tärningar och
de gula är för den 3:dje tärningen med stigande värde.
Nu ser man tydligt hur det hänger ihop!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Tre Tärningar
Gjorde en bruteforcelösning i python, mest för skoj... och lite för att visa två angreppssätt på liknande problem.
Koden hystar ur sig alla tänkbara lösningar från 1 till 6^antal_tärningar.
Vad vill jag visa ... ptjaa att trots långsamma python så kan man snabbt labba fram lösningar och simuleringar på det mesta. För egen del som matematiker så måste jag erkänna att efter en vända runt i tankekontoret för att bilda en uppfattning om vad som kan tänkas rimligt i form av svar m.m. så brukar en snabb kodsnutt kunna ge bra insikt i problem. Problem där slutna lösningar kanske är möjliga men tidskrävande och där simulering och lite statistik, sannolikhetslära och lagar om stora tal ofta inte är långt från sanningen.
1. Det långsamma sättet som är bra om man saknar minne mer cpu mindre minne
Output:
Tidtagning (utan utskrifter)
för tre tärningar: 13 ms
för fyra tärningar: 90 ms
för fem tärningar: 636 ms
för sex tärningar: 4.3s
2. Det snabba sättet som kräver lite mer minne (i alla fall i detta utförandet)
Tidtagning (utan utskrifter)
för tre tärningar: 96 us (mikrosekunder)
för fyra tärningar: 634 us
för fem tärningar: 4.31 ms
för sex tärningar: 28 ms
för sju tärningar: 226 ms
för åtta tärningar: 1.24 s
för nio tärningar: 8 s
Koden hystar ur sig alla tänkbara lösningar från 1 till 6^antal_tärningar.
Vad vill jag visa ... ptjaa att trots långsamma python så kan man snabbt labba fram lösningar och simuleringar på det mesta. För egen del som matematiker så måste jag erkänna att efter en vända runt i tankekontoret för att bilda en uppfattning om vad som kan tänkas rimligt i form av svar m.m. så brukar en snabb kodsnutt kunna ge bra insikt i problem. Problem där slutna lösningar kanske är möjliga men tidskrävande och där simulering och lite statistik, sannolikhetslära och lagar om stora tal ofta inte är långt från sanningen.
1. Det långsamma sättet som är bra om man saknar minne mer cpu mindre minne
Kod: Markera allt
from itertools import product
from operator import mul
from functools import reduce
N_dice = 3
dices = (range(1,7),)*N_dice
for target in range(1, 6**N_dice+1):
ok = [vals for vals in product(*dices) if reduce(mul, vals) == target]
if len(ok):
print(f"For {target} there are {len(ok)} combinations, {len(ok)/6**N_dice*100:0.2f}%")
Kod: Markera allt
For 1 there are 1 combinations, 0.46%
For 2 there are 3 combinations, 1.39%
For 3 there are 3 combinations, 1.39%
For 4 there are 6 combinations, 2.78%
For 5 there are 3 combinations, 1.39%
For 6 there are 9 combinations, 4.17%
For 8 there are 7 combinations, 3.24%
For 9 there are 3 combinations, 1.39%
For 10 there are 6 combinations, 2.78%
For 12 there are 15 combinations, 6.94%
For 15 there are 6 combinations, 2.78%
For 16 there are 6 combinations, 2.78%
For 18 there are 9 combinations, 4.17%
For 20 there are 9 combinations, 4.17%
For 24 there are 15 combinations, 6.94%
For 25 there are 3 combinations, 1.39%
For 27 there are 1 combinations, 0.46%
For 30 there are 12 combinations, 5.56%
For 32 there are 3 combinations, 1.39%
For 36 there are 12 combinations, 5.56%
For 40 there are 6 combinations, 2.78%
For 45 there are 3 combinations, 1.39%
For 48 there are 9 combinations, 4.17%
For 50 there are 3 combinations, 1.39%
For 54 there are 3 combinations, 1.39%
For 60 there are 12 combinations, 5.56%
For 64 there are 1 combinations, 0.46%
For 72 there are 9 combinations, 4.17%
For 75 there are 3 combinations, 1.39%
For 80 there are 3 combinations, 1.39%
For 90 there are 6 combinations, 2.78%
For 96 there are 3 combinations, 1.39%
For 100 there are 3 combinations, 1.39%
For 108 there are 3 combinations, 1.39%
For 120 there are 6 combinations, 2.78%
For 125 there are 1 combinations, 0.46%
For 144 there are 3 combinations, 1.39%
For 150 there are 3 combinations, 1.39%
For 180 there are 3 combinations, 1.39%
For 216 there are 1 combinations, 0.46%
för tre tärningar: 13 ms
för fyra tärningar: 90 ms
för fem tärningar: 636 ms
för sex tärningar: 4.3s
2. Det snabba sättet som kräver lite mer minne (i alla fall i detta utförandet)
Kod: Markera allt
from itertools import product
from operator import mul
from functools import reduce
from collections import defaultdict
sols = defaultdict(list)
N_dice = 3
dices = (range(1,7),)*N_dice
for vals in product(*dices):
sols[reduce(mul, vals)].append(vals)
for k,v in sorted(sols.items()):
if len(v):
print(f"For {k} there are {len(v)} combinations, {len(v)/6**N_dice*100:0.2f}%")
för tre tärningar: 96 us (mikrosekunder)
för fyra tärningar: 634 us
för fem tärningar: 4.31 ms
för sex tärningar: 28 ms
för sju tärningar: 226 ms
för åtta tärningar: 1.24 s
för nio tärningar: 8 s
-
- Inlägg: 982
- Blev medlem: 2 juli 2010, 23:04:07
Re: Tre Tärningar
Det blev verkligen kompakt kod.
Som sagt finns flera sätt att koda.
Jag skulle också vilja klocka tiden för min variant och den är förmodligen långsammare.
Jag får läsa på om jag vill ta tiden.
Blev Java-kod.
Som sagt finns flera sätt att koda.
Jag skulle också vilja klocka tiden för min variant och den är förmodligen långsammare.
Jag får läsa på om jag vill ta tiden.
Blev Java-kod.
Kod: Markera allt
public class Dices {
/*
* Generera produkterna av två tärningar
* Returnera talen i en vektor, 36 tal.
*/
public int[] twoDiceProduct(){
int x = 1;
int y = 1;
int[] product = new int[36];
int counter = 0;
while(y<=6) {
while (x<=6) {
product[counter] = x*y;
counter += 1;
x += 1;
}
x = 1;
y +=1;
}
return product;
}
/* Generera 6 vektorer med produkter. Varje vektor
* är en kopia av produktvektorn för 2 tärningar multiplicerad
* med 1, 2, 3, 4, 5 och 6. Dessa 6 vektorer slås sedan samman till
* en hel vektor.
* Returnera den sammanslagna vektorn.
*/
public int[] allDices(int[] twoDiceProduct) {
int[] dice_B = new int[36];
int[] dice_C = new int[36];
int[] dice_D = new int[36];
int[] dice_E = new int[36];
int[] dice_F = new int[36];
int[] allDices = new int[36*6];
for(int i = 0;i < 36; i++) {
dice_B[i] = 2 * twoDiceProduct[i];
dice_C[i] = 3 * twoDiceProduct[i];
dice_D[i] = 4 * twoDiceProduct[i];
dice_E[i] = 5 * twoDiceProduct[i];
dice_F[i] = 6 * twoDiceProduct[i];
}
for(int i = 0;i < 36; i++) {
allDices[i] = twoDiceProduct[i];
}
for(int i = 36;i < 2*36; i++) {
allDices[i] = dice_B[i-36];
}
for(int i = 2*36;i < 3*36; i++) {
allDices[i] = dice_C[i-2*36];
}
for(int i = 3*36;i < 4*36; i++) {
allDices[i] = dice_D[i-3*36];
}
for(int i = 4*36;i < 5*36; i++) {
allDices[i] = dice_E[i-4*36];
}
for(int i = 5*36;i < 6*36; i++) {
allDices[i] = dice_F[i-5*36];
}
return allDices;
}
/*
* Sök igenom en vektor efter tal/produkter som
* motsvarar ett tärningskast med tre tärningar.
* Returnera antalet hittade tal.
*/
public int search(int produkt, int[] allDices) {
int x = 0;
for(int index = 0; index < 216; index++) {
if(allDices[index] == produkt) {
x++;
}
}
return x;
}
}
Kod: Markera allt
public class Dice {
public static void main(String[] args) {
Dices dices;
dices = new Dices();
int[] allDices = new int[216];
int antalProdukter;
int produkt;
int[] twoDiceProduct = dices.twoDiceProduct();
allDices = dices.allDices(twoDiceProduct);
produkt = 22;
antalProdukter = dices.search(produkt, allDices);
System.out.println("Antal Tärningskast som ger " + produkt + " är " + antalProdukter);
}
}
Kod: Markera allt
Antal Tärningskast som ger 18 är 9