Tre Tärningar

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Tre Tärningar

Inlägg av 4kTRB »

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.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Tre Tärningar

Inlägg av Icecap »

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).
Palle500
Inlägg: 4490
Blev medlem: 6 juni 2015, 14:53:06

Tre Tärningar

Inlägg av Palle500 »

Produkten är det som efterfrågas inte summan!
6x6x6=216
Där Produkten = 24
6x2x2=24
4x2x3=24
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

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?
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

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 ?
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

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.
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

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
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

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
Användarvisningsbild
rvl
Inlägg: 5780
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Tre Tärningar

Inlägg av rvl »

Palle500 skrev: 5 november 2020, 06:30:22 Produkten är det som efterfrågas inte summan!
6x6x6=216
Där Produkten = 24
6x2x2=24
4x2x3=24
Du glömde 1x4x6. (Sen har vi ju förståss olika permutationer av dessa, OM ordingen på tärningarna spelar roll.)
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

12 och 60 verkar vara trevliga tal
Klockrena tal!
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

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!
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

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!
DiceCalc_000.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
mounte
Inlägg: 204
Blev medlem: 14 november 2010, 13:15:00
Ort: Sandviken

Re: Tre Tärningar

Inlägg av mounte »

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 :D 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}%")
Output:

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%
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)

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}%")
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
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: Tre Tärningar

Inlägg av Findecanor »

4kTRB skrev: 4 november 2020, 23:44:11 x
Alt Gr + Shift + '*
Användarvisningsbild
4kTRB
Inlägg: 18358
Blev medlem: 16 augusti 2009, 19:04:48

Re: Tre Tärningar

Inlägg av 4kTRB »

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.

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
Skriv svar