• 5
  • 6
2025-07-10, 23:21
  #61
Medlem
StoreSvartes avatar
Citat:
Ursprungligen postat av Chokladmums
uppdaterad kod baserad på vinsttabellen för triss 40:

Kod:
import numpy as np
winamount = [2765000, 1000000, 265000, 200000, 100000, 50000, 20000, 10000, 5000, 2500, 2000, 1500, 1000, 900, 750, 600, 500, 450, 400, 300, 200, 180, 150, 120, 90, 80, 60, 40, 0 ]
numberof = [1, 2, 25, 1, 2, 3, 7, 46, 30, 16, 50, 80, 150, 60, 50, 200, 190, 110, 280, 500, 760, 900, 2660, 6000, 23500, 91675, 77000, 249500, 1546202]
total = 2000000
prob= np.array(numberof) / total
print(prob)
winamount_array = np.array(winamount)
results = []
rounds = 2000
del len
num_win_amounts = len(winamount)

# Create a pool of tickets based on numberof
ticket_pool = []
for i in range(num_win_amounts):
    ticket_pool.extend([winamount[i]] * numberof[i])

# Convert the pool to a numpy array for efficient sampling
ticket_pool = np.array(ticket_pool)

for _ in range(rounds):
    # Draw 300 tickets from the pool without replacement
    draw = np.random.choice(ticket_pool, size=300, replace=False)
    total_win = np.sum(draw)
    results.append(total_win)

results = np.array(results)
mean_win = np.mean(results)
max_win = np.max(results)
min_win = np.min(results)
q1 = np.percentile(results, 25)
q2 = np.percentile(results, 50)
q3 = np.percentile(results, 75)
import matplotlib.pyplot as plt

# === Plot histogram of total wins ===
plt.figure(figsize=(10, 6))
plt.hist(results, bins=50, color='skyblue', edgecolor='black')
plt.title("Histogram of Total Winnings per 300 Tickets (10,000 Draws)")
plt.xlabel("Total Win (kr)")
plt.ylabel("Number of Draws")
plt.grid(True)
plt.axvline(mean_win, color='red', linestyle='dashed', linewidth=2, label=f'Mean: {mean_win:,.0f} kr')
plt.legend()
plt.show()

# === Print summary stats ===
print(f"Average win: {mean_win:,.2f} kr")
print(f"Max win:     {max_win:,.2f} kr")
print(f"Min win:     {min_win:,.2f} kr")
print(f"Q1 (25th percentile): {q1}")
print(f"Q2 (Median): {q2}")
print(f"Q3 (75th percentile): {q3}")
print(f"Net average profit (ticket cost = 300*30 kr): {mean_win - 9000:,.2f} kr")

resultat denna körning med 2000 rundor:
Average win: 5,279.85 kr
Max win: 270,230.00 kr
Min win: 2,300.00 kr
Q1 (25th percentile): 3590.0
Q2 (Median): 3920.0
Q3 (75th percentile): 4310.0
Net average profit (ticket cost = 300*30 kr): -3,720.15 kr

Bra jobbat!
__________________
Senast redigerad av StoreSvarte 2025-07-10 kl. 23:25.
Citera
2025-07-10, 23:51
  #62
Medlem
nerdnerds avatar
Citat:
Ursprungligen postat av Chokladmums
uppdaterad kod baserad på vinsttabellen för triss 40:

Kod:
import numpy as np
winamount = [2765000, 1000000, 265000, 200000, 100000, 50000, 20000, 10000, 5000, 2500, 2000, 1500, 1000, 900, 750, 600, 500, 450, 400, 300, 200, 180, 150, 120, 90, 80, 60, 40, 0 ]
numberof = [1, 2, 25, 1, 2, 3, 7, 46, 30, 16, 50, 80, 150, 60, 50, 200, 190, 110, 280, 500, 760, 900, 2660, 6000, 23500, 91675, 77000, 249500, 1546202]
total = 2000000
prob= np.array(numberof) / total
print(prob)
winamount_array = np.array(winamount)
results = []
rounds = 2000
del len
num_win_amounts = len(winamount)

# Create a pool of tickets based on numberof
ticket_pool = []
for i in range(num_win_amounts):
    ticket_pool.extend([winamount[i]] * numberof[i])

# Convert the pool to a numpy array for efficient sampling
ticket_pool = np.array(ticket_pool)

for _ in range(rounds):
    # Draw 300 tickets from the pool without replacement
    draw = np.random.choice(ticket_pool, size=300, replace=False)
    total_win = np.sum(draw)
    results.append(total_win)

results = np.array(results)
mean_win = np.mean(results)
max_win = np.max(results)
min_win = np.min(results)
q1 = np.percentile(results, 25)
q2 = np.percentile(results, 50)
q3 = np.percentile(results, 75)
import matplotlib.pyplot as plt

# === Plot histogram of total wins ===
plt.figure(figsize=(10, 6))
plt.hist(results, bins=50, color='skyblue', edgecolor='black')
plt.title("Histogram of Total Winnings per 300 Tickets (10,000 Draws)")
plt.xlabel("Total Win (kr)")
plt.ylabel("Number of Draws")
plt.grid(True)
plt.axvline(mean_win, color='red', linestyle='dashed', linewidth=2, label=f'Mean: {mean_win:,.0f} kr')
plt.legend()
plt.show()

# === Print summary stats ===
print(f"Average win: {mean_win:,.2f} kr")
print(f"Max win:     {max_win:,.2f} kr")
print(f"Min win:     {min_win:,.2f} kr")
print(f"Q1 (25th percentile): {q1}")
print(f"Q2 (Median): {q2}")
print(f"Q3 (75th percentile): {q3}")
print(f"Net average profit (ticket cost = 300*30 kr): {mean_win - 9000:,.2f} kr")

resultat denna körning med 2000 rundor:
Average win: 5,279.85 kr
Max win: 270,230.00 kr
Min win: 2,300.00 kr
Q1 (25th percentile): 3590.0
Q2 (Median): 3920.0
Q3 (75th percentile): 4310.0
Net average profit (ticket cost = 300*30 kr): -3,720.15 kr
Tjusigt!
Och tack!
Snygga tricks också, lyfter på hatten för det. Ska jag nog provköra själv och mecka lite med.

Medianen är alltså en rätt bra bit under medlet. "Polaren" skulle troligen få ihop en vinst på omkring fyra tusen.
Citera
2025-07-13, 00:46
  #63
Medlem
nerdnerds avatar
Citat:
Ursprungligen postat av vanartad
Skulle vara intressant att få reda på hur du skall kunna skriva koden med tanke på att du inte känner fördelningen. Mig veterligen finns det inget annat sätt än Monte-Carlo, vilket rent teoretiskt skulle kunna beräkna fördelningen, utan att faktiskt veta hur fördelningen ser ut.
Det är inte med kod utan med matematik. Vi vet ju vinsternas sannolikhetsfördelningen för EN lott. Från detta kan man beräkna sannolikhetsfördelningen för två eller fler lotter, approximativt (enklast) eller exakt (svårare), och därifrån sedan allt man vill veta om medel, varians, median, kvartiler, etc. Dessa beräkningar görs med integraler (för kontinuerlig fördelning) resp summor (för diskret fördelning som vi har här) och för DESSA beräkningar kan man då iofs behöva räkna numeriskt med ett program.

Så mycket mer vill jag inte säga om det innan jag har gjort något av detta själv, vilket jag inte har tid med på ett tag framöver (veckor). Återkommer, hoppas jag.
Citera
2025-07-30, 08:58
  #64
Medlem
nerdnerds avatar
Citat:
Ursprungligen postat av vanartad
Skulle vara intressant att få reda på hur du skall kunna skriva koden med tanke på att du inte känner fördelningen. Mig veterligen finns det inget annat sätt än Monte-Carlo, vilket rent teoretiskt skulle kunna beräkna fördelningen, utan att faktiskt veta hur fördelningen ser ut.
Har inte helt gett upp om detta, men med 30 lotter är min originalplan iaf helt ogörlig, ens med en superdator.

Tanken var alltså att räkna exakt på sannolikheterna, som vi ju har direkt från vinstplanen om vi bara har EN lott, för att beräkna allt sånt som median (blir noll eftersom mindre än hälften av lotterna ger vinst), kvartiler etc. Med TVÄ lotter blir det lite mer om kombinatorik. Vi har 29 olika möjliga utfall per lott, och med två lotter alltså 29² olika ordnade utfall (dvs om vi skiljer på vilken ordning man får t ex en nitlott och en vinst).

Med fler lotter blir det snabbt väldigt många olika kombinationer av utfall, som i princip skulle kunna ge 29³⁰=7.4×10⁴³ olika kombinationer! (Dock några färre eftersom man ju t ex inte kan få 30 högsta vinster).

Planen är nu att undersöka lite mer approximativa metoder, men alltså ändå jobba direkt med sannolikhetsfördelningen. Återkommer?
Citera
2025-08-01, 11:10
  #65
Medlem
Kollade litet på detta, tydligen kan man kolla på varje brackets mean individuellt och sedan bara addera för variansen måste man korrigera med covariansen, men efter det kan man bara addera variansen också. Det funkar också att låta de största delgrupperna approximeras med en normalfördelning.

Litet kod:

Kod:
import numpy as np


numberof = np.array(numberof)
winamount = np.array(winamount)
prob = np.array(prob)


N = 2_000_000       # total population
n = 300             # number of tickets

# Expected wins per subgroup
expected_win_subgroup = winamount * n * prob

product = winamount * prob
total = np.sum(product)

# Covariance correction vector
covar_vector = -2 * product * (total - product)

# Variance vector: hypergeometric approximation per subgroup
variance_vector = (
    (n * numberof / N) * ((N - numberof) / N) * (N - n) / (N - 1)
    - covar_vector
)

print("Variance vector:\n", variance_vector)

# Total variance and expected wins
total_variance = np.sum(variance_vector)
total_expected_win = np.sum(expected_win_subgroup)

print("Total variance:", total_variance)
print("Total expected wins:", total_expected_win)

# Determine whether normal approximation is reasonable
hyper_or_norm = np.where(n * prob > 5, 1, 0)

print("Use normal approximation (1=yes):\n", hyper_or_norm)

Utdata:
Variance vector:
[ 50.37153748 37.20029995 107.90843689 3.90014998 3.90029995
2.92919993 2.73524984 8.91709881 2.93324926 0.78559962
1.96249869 2.35679773 2.95124495 1.06594038 0.74179557
2.37479252 1.88598053 0.9854715 2.23091584 3.00372004
3.08158764 3.29699708 8.13920926 14.74996585 42.70044795
129.9715875 90.98346475 178.55913419 52.61688574]
Total variance: 765.2395594325168
Total expected wins: 5880.0
Use normal approximation (1=yes):
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1]
Citera
  • 5
  • 6

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in