Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Loton simulointia

Sivun loppuun

PetriKeckman [31.01.2023 09:29:11]

#

Lievän uhkapeliaddiktion omaavana tiedän, että uhkapelit eivät kannata, kasino voittaa aina ja lotosta puhuttaessa Oy Veikaus Ab ja onneksi myös urheilu ja kulttuuri. Silti lottoa kannattaa vain simuloida (ellei halua tukea urheilua ja kulttuuria). Tein ohjelman REBOL:n sijasta Red:llä - en nyt kuitenkaan osannut tehdä MSDOS .exe tiedostoa, mille syötettäisiin parametrina arvottujen rivien eli lottokierrosten määrä. Pistin ohjelman ajamaan 10 miljoonaa kierrosta. Toki sen voi pysäyttää CNTRL-C:llä.

http://petke.info/lottosimulointi.exe

Loton säännöt ovat vuosien varrella monesti muuttuneet. Tässä ovat kai ajantasaiset: arvotaan 7 varsinaista numeroa 1-40 ja yksi lisänumero. Nykyisin arvotaan myös Plus numero, jolla voi viisinkertaistaa muut paitsi päävoiton. Tällä Plus numerolla en nyt lähtenyt leikkimään. Plus rivi maksaisi 1.50 €. Tavallinen rivi 1.00 €.

Ohjelma tulostaa tilanteen kun rivi muuttujan arvo on ilmaistavissa 10 kokonaisluku potenseissa, siis kierroksilla 1,10,100,1000 jne...Myös jos on 6, 6 ja lisänumero tai 7 oikein tulostetaan rivi ja tilanne.

Kuusi oikein on itseasiassa melko usein. Olen kuullut, että aiheutti ison perheriidan, kun vaimo oli lotannut 6 oikein ja mies vihastui toden teolla, että "Etkö sä nyt saatana vittu osannut sitä seitsämättä numeroa lotata oikein?!!?" - siis tämä oli tosi tarina, siksi totuudenmukainen kiroilu...

Red ohjelmointikieltä tuetaan monissa alustoissa: https://www.red-lang.org/p/getting-started.html

Here is a list of currently supported platforms:

MSDOS : Windows, x86, console (+ GUI) applications
Windows : Windows, x86, GUI applications
WindowsXP : Windows, x86, GUI applications, no touch API
Linux : GNU/Linux, x86
Linux-ARM : GNU/Linux, ARMv5, armel (soft-float)
RPi : GNU/Linux, ARMv5, armhf (hard-float)
Darwin : macOS Intel, console-only applications
macOS : macOS Intel, applications bundles
Syllable : Syllable OS, x86
FreeBSD : FreeBSD, x86
Android : Android, ARMv5
Android-x86 : Android, x86

Kannattaa ohjelmoida Red:llä! :) Red kääntäjä ei muuten tykkää ääkkösistä edes kommenteissa...

Red[]
;Kierroksen 3/2023 voitonjako
voittoosuudet: [
11000000.00 ;7 oikein
96814.76  ;6 + lisanumero
3033.04  ;6 oikein
70.50 ; 5 oikein
10.00 ;nelja oikein
2.00 ;3 + lisanuero
]
lukumaara: 10000000 ; simuloidaan 10 miljoonaa kierrosta
tulot: 0 ;pidetaan kirjaa voitoista
menot: 0 ;ja menoista
random/seed now/precise
oikearivi: copy[]
lkm: 0
while [lkm < 8] [ ;arvotaan oikea rivi. Arvotaan 7 numeroa + 1 lisanumero
	numero: random 40
	if not find oikearivi numero [
		append oikearivi numero
		lkm: lkm + 1
	]
]
montaoikein: func[][ ;monta varsinaista numeroa oikein?
	numeroindeksi: 1
	kpl: 0
	loop 7 [ ;tarkistetaan vain 7 ensimaista oikean rivin numerolla
		numero: oikearivi/(numeroindeksi)
		foreach num2 arvotturivi [
			if (numero = num2) [
				kpl: kpl + 1
			]
		]
		numeroindeksi: numeroindeksi + 1
	]
	return kpl
]
lisanumero: func[][ ; Loytyyko lisanumero
	onlisa: false
	foreach num arvotturivi [
		if num = oikearivi/8 [onlisa: true]
	]
	return onlisa
]
tulostatilanne: func [][
		print rejoin ["Menot: " menot "  Tulot: " tulot "    Budjetti: " tulot - menot]
]
tulosta7tai6tai6jalisanumero: func[][
	sort oikearivi ;sortataan manuaalisen tarkistuksen helpottamiseksi
	sort arvotturivi
	print rejoin [" Rivinumero: " rivi]
	print "Oikea rivi:"
	probe oikearivi
	print "Pelaamasi arvotturivi:"
	probe arvotturivi
	tulostatilanne
	print "******************"
]

rivi: 0
potenssi: 0
while [rivi < lukumaara][
	;arvotaan rivi
	arvotturivi: copy[]
	lkm: 0
	while [lkm < 7] [ ;arvotaan rivi
		numero: random 40
		if not find arvotturivi numero [
			append arvotturivi numero
			lkm: lkm + 1
		]
	]
	case [ ;case rakennetta voidaan kayttaa, koska heti kun ehtoon mennaan, niin sita seuraaviin ei
		montaoikein = 7 [tulot: tulot + voittoosuudet/1 prin "Huraa! Seitseman oikein!" tulosta7tai6tai6jalisanumero]
		montaoikein = 6 and lisanumero [tulot: tulot + voittoosuudet/2 prin "6 ja lisanumero oikein" tulosta7tai6tai6jalisanumero]
		montaoikein = 6 [tulot: tulot + voittoosuudet/3 prin "6 oikein" tulosta7tai6tai6jalisanumero]
		montaoikein = 5 [tulot: tulot + voittoosuudet/4]
		montaoikein = 4 [tulot: tulot + voittoosuudet/5]
		montaoikein = 3 and lisanumero [tulot: tulot + voittoosuudet/6]
	]
	if rivi = (power 10 potenssi) [tulostatilanne potenssi: potenssi + 1]
	rivi: rivi + 1
	menot: menot + 1 ;yksi rivi maksaa euron
]
tulostatilanne
halt

PetriKeckman [31.01.2023 11:22:35]

#

Olen nyt muutaman kerran simuloinnut ja 7 oikeinkin on tullut - tietysti jotain 1/40 kertaa se määrä mikä 6 oikein ja 6 oikein tulostuu tosiaan melko usein. Voisin olla jopa voitolla! - koodissani ei mielestäni ole virhettä - ihme ja harvinaista? En nyt kuitenkaan vielä ala lottoamaan :) Varmaankin, muuten Veikkaus Oy:ssa tiedostetaan se, että ihmiset lottoavat jonkin verran epäsatunnaisesti numeroita: esimerkiksi laittavat lastensa ja lasten lastensa syntymävuosia ja kuukausia ja päiviä, niin rivit eivät ole yhtä satunnaisia kuin tässä, vaan kaikki numerot alle 31.

Oliskin kiva tehdä ohjelma, mikä tuottaa mahdollisimman erilaisia rivejä. Olen joskus tutkinut asiaa ja päädyin siihen, että varmasti saa neljä oikein kun lottoaa muistaakseni noin 240 mahdollisimman erilaista riviä.

PetriKeckman [31.01.2023 18:18:43]

#

EDIT:! Tekstini sisältää muutamia ajatusvirheitä!! Siis taulukon rivit kokohan tietysti kasvaa yli äyräidensä, koska se sisältää nimenomaan arvottuja rivejä, eikä mahdollisimman erilaisia...
**********************************
Yritän lotata "mahdollisiman erilaisia rivejä". Ensin tuotetaan siis rivejä, joilla on aikaisemmin tuotettujen rivien kanssa nolla oikein. Manuaalisestihan tällaiset rivit voisivat olla ensin 1,2,3,4,5,6,7 ja sitten 8,9,10,11,12,13,14 ja sitten 15,16,17,18,19,20,21 jne...Tähän asti manuaalisesti helpppoa. Ideana on siis aluksi tuottaa rivit joissa on väkisinkin yksi oikein - kun ei enää voida tuottaa riviä, joissa on nolla oikein jo lotattujen rivien kanssa, niin "voittaa" väkisinkin yhden oikein.

Tämän jälkeen olisikin kai hankalaa manuaalisesti yrittää tuottaa rivejä, joissa on väkisinkin kaksi oikein - no se ehkä menisi vielä, mutta entä kolme, neljä tai viisi? Omat aivoni menisivät sotkuun.

Pistin siis ohjelman asialle.

http://petke.info/erilaisia.exe

Siinä rumasti, koska en saanut kaikenlaisista kokeiluista huolimatta yksinkertaisella tavalla tehtyä red-kielessä blockkia, mikä koostuu blockeista, niin sijoituskäskystä tuli tällainen hirviö:

append rivit to-block compose rejoin ["[" arvotturivi/1 " " arvotturivi/2 " " arvotturivi/3 " " arvotturivi/4 " " arvotturivi/5 " " arvotturivi/6 " " arvotturivi/7 " " "]"]

Se toimii, mutta näyttää sotkuiselta. Ohjelma tulosti:

E:\Tiede\lotto>erilaisia.exe
Vahintaan 1 saa noin 4:lla rivilla
Vahintaan 2 saa noin 10:lla rivilla
Vahintaan 3 saa noin 46:lla rivilla
Vahintaan 4 saa noin 307:lla rivilla

*** Runtime Error 1: access violation
*** at: 530004E6h

En ymmärrä mistä tuo acces violation error tulee - ohjelmassanihan (ellei siinä ole bugia) ainoastaan taulukon/blockin, minkä alkioina ovat blockit so. jo lotatut rivit kasvaa ja senkin lukumäärä on vaivaiset 307 siinä vaiheessa kun saadaan tod.näk. varmasti 4 oikein. Kasvaako muka lotattavien rivien lukumäärä niin suureksi, kun halutaan väkisinkin 5 oikein, että muisti loppuu mun koneelta kesken?! No ei voi! Eihän väkisinkin 7 oikeaan tarvita kuin 15 380 937 erilaista lottoriviä, joissa jokaisessa on siis 7 lukua - se tekee 107 miljoonaa 666 tuhatta 559 lukua.. Eli jos yksi luku vie 32 byteä, niin se tekee...monta Megaa? Äh, En ny jaksa laskea tällä hetkellä.

No himpskatti! Tätä kirjoittaessani ja ajaessani ohjelmaa, se tulostikin:

E:\Tiede\lotto>erilaisia.exe
Vahintaan 1 saa noin 4:lla rivilla
Vahintaan 2 saa noin 10:lla rivilla
Vahintaan 3 saa noin 46:lla rivilla
Vahintaan 4 saa noin 307:lla rivilla
Vahintaan 5 saa noin 2813:lla rivilla

Eli mikä lie oli syynä. Ajan ohjelmaa paremmalla ajalla ja tutkin tuottaako se suurinpiirtein oikeita arvoja. Ja mietin tuota yrityksia-muuttujan arvoa - miten se vaikuttaa lopputulokseen. Jokin arvohan sillä täytyy olla (aluksi tuhat, jota sitten kasvatetaan), sillä muuten ohjelma ei tiedä, koska oikein-muuttujan arvoa täytyy nostaa, kun ei enää saada tuotettua lottoriviä, missä on vain oikein kpl oikein...

Red[title: "Tuotetaan mahdollisimman erilaisia riveja"]
rivit: copy[] ;tahan blockkiin/taulukkoon pistetaan lotattuja riveja
yrityksia: 1000 ;maks yritys lkm mita tehdaan, jotta olisi mahdollisimman vahan oikein edellisten rivien kanssa.
; tata kasvatetaan kertomalla se kahdella kun siirrytaan tutkimaan seuraavia riveja.

arvorivi: func[][
	lkm: 0
	arvotturivi: copy[]
	while [lkm < 7] [ ;arvotaan rivi
		numero: random 40
		if not find arvotturivi numero [
			append arvotturivi numero
			lkm: lkm + 1
		]
		;print lkm
	]
]
montaoikein: func[rivi1 rivi2][ ;monta samaa numeroa rivi1:ssa ja rivi2:ssa?
	if (length? rivit) = 0  [return 0]
	numeroindeksi: 1
	kpl: 0
	loop 7 [
		numero: rivi1/(numeroindeksi)
		foreach num2 rivi2 [
			if (numero = num2) [
				kpl: kpl + 1
			]
		]
		numeroindeksi: numeroindeksi + 1
	]
	return kpl
]
enitenoikein: func [][ ;kay lapi kaikki jo lotatut rivit ja palauttaa suurimman oikeiden numeroiden lukumaaran niiden kanssa
	isoinkpl: 0
	foreach rivi rivit [
		oik: montaoikein rivi arvotturivi
		if  oik >= isoinkpl [isoinkpl: oik]
	]
	return isoinkpl
]
oikein: 0 ;aluksi saa olla vain nolla oikein toisten jo lotattujen rivien kanssa
yritys: 1
until [
	until [
		arvotturivi: copy[]
		arvorivi
		if enitenoikein <= oikein [
			append rivit to-block compose rejoin ["[" arvotturivi/1 " " arvotturivi/2 " " arvotturivi/3 " " arvotturivi/4 " " arvotturivi/5 " " arvotturivi/6 " " arvotturivi/7 " " "]"]
		]
		yritys: yritys + 1
		(yritys > yrityksia)
	]
	print rejoin ["Vahintaan " oikein + 1 " saa noin " length? rivit ":lla rivilla"]
	yrityksia: yrityksia * 2 ;kasvatetaan yritysten määrää.
	oikein: oikein + 1
	oikein = 5
]
halt

PetriKeckman [31.01.2023 18:46:49]

#

MITEN TUOTETAAN MAHDOLLISIMMAN ERILAISIA LOTTORIVEJÄ??!! Onko ratkaisu helppo? Vai oisko tässä jopa kilpailun ainesta, joita ei kai viime vuonna ollut? Sori capsit, mutta alkaa jo hermostuttmaan ongelma.

peran [31.01.2023 19:06:24]

#

Itse tekisin niin, että pyytäisin käyttäjää arpomaan numerot.

Eli jos käyttäjää pyydettäisiin painamaan välilyöntiä tai rivinvaihtoa, ja sillä aikaa ohjelma pyörisi ikuisessa silmukassa samaan aikaan kasvattaisi muuttujan arvoa yhdellä, kunnes havaitsisi painalluksen.

Sen jälkeen ottaisin pyörineen integermuuttujan jakojäännöksen, ja saisin varsin satunnaisen pallonluvun.

Edit - Toki tuollaisen useamman miljoonan rivin arpominen veisi jonkin verran käyttäjän aikaa. :P

PetriKeckman [31.01.2023 19:15:34]

#

Hauska idea satunnaislukujen tuottamiseksi,

Mutta en koe ongelmaksi tässä threadissa lottorivien tuottamisen. Tosin pseudosatunnaislukujahan nuo ovat, mutta jos se koettaisiin ongelmaksi, niin Red:ssä voidaan Random funktiolle antaa parametri security, jolloin se tuottaa vielä paaaallljjooon satunnaisempia lukuja kuin tavallisempi pelkkä Random.

Tässä threadissa vain simuloitiin Lottoa, huvikseen. Ohjelmoinnin huvista ja sitten aihe muuttui tuoksi mahdollisiman erilaisten rivien tuottamiseksi. Kombinaatioistahan siinä lienee kysymys...? En vaan osaa, vielä.

PetriKeckman [31.01.2023 19:50:20]

#

peran kirjoitti:

Itse tekisin niin, että pyytäisin käyttäjää arpomaan numerot.

Vielä peran:lle selvennykseksi: threadin aihe muuuttui tällaiseksi:

Monta riviä tarvitaan, että saadaan väkisin yksi oikein?
Monta riviä tarvitaan, että saadaan väkisin kaksi oikein?
Monta riviä tarvitaan, että saadaan väkisin kolme oikein?
Monta riviä tarvitaan, että saadaan väkisin neljä oikein?
Monta riviä tarvitaan, että saadaan väkisin viisi oikein?
Monta riviä tarvitaan, että saadaan väkisin kuusi oikein?

Seitsemän oikein lienee helppo: tuotetaan kaikki mahdolliset erilaiset lottorivit...

PetriKeckman [31.01.2023 20:08:09]

#

Tällä pienellä lisätoiminnolla:

rivit: unique rivit ;ei nyt sentaan tallenneta kahta samanlaista rivia turhaan rivit taulukkoon!

Vaikka kasvatin yrityksia muuttujan arvoa huimaksi, ohjelma ei tunnu kaatuvan...pyörii vaan pirun hitaasti.

Nyt se voi jopa teoriassa toimia 7:aan saakka, koska käsittääkseni kaikki erilaiset lottorivit mahtunevat tietokoneen muistiin?

EDIT: kaatui:

*** Runtime Error 1: access violation
*** at: 52FF28DBh

Grez [31.01.2023 21:03:40]

#

PetriKeckman kirjoitti:

Seitsemän oikein lienee helppo: tuotetaan kaikki mahdolliset erilaiset lottorivit...

Myös yksi oikein on helppo. Rivejä tarvitaan vähintään (40-6)/7 eli viisi, koska osittaisia rivejä ei voi tehdä.

PetriKeckman kirjoitti:

Monta riviä tarvitaan, että saadaan väkisin neljä oikein?

Tätä aihetta on mietitty aiemminkin:
https://www.ohjelmointiputka.net/keskustelu/31998-lottorivijoukkojen-generointi

Tuossa ketjussa todettiin vastauksen olevan todennäköisesti välillä [329,379]

jalski [31.01.2023 21:18:36]

#

Mikset käsittelisi lottorivejä bitteinä? Taipuuko Red tai Rebol tuohon? Säästäisit muistia, lottorivien tarkastaminen olisi helpompaa ja paljon nopeampaa!

Alla oleva esimerkki selventänee ideaa:

: msb?  \ n -- msb
  n:ln 2 n:ln n:/ n:int ;

\ Bits set in the 32-bit integer
: bits32-set?  \ n -- n
  dup 1 n:shr x55555555 n:band n:-
  dup 2 n:shr x33333333 n:band swap x33333333 n:band n:+
  dup 4 n:shr n:+ x0f0f0f0f n:band
  dup 8 n:shr n:+ x00ff00ff n:band
  dup 16 n:shr n:+ x0000ffff n:band ;

\ Bits set in the integer, handle 32-bit at a time
: bits-set?  \ n -- n
  dup >r msb? n:1+ 32 n:/mod swap if
    n:1+
  then
  >r 0
  ( r@ swap n:shr xffffffff n:band bits32-set?
    n:+ \ bits set
    32 step ) 0 r> 5 n:shl n:1- loop rdrop ;

: decode  \ n -- a
  a:new
  ( 2 pick 1 n:band if
      a:push
    else
      drop
    then
    swap 1 n:shr swap
  ) 0 3 pick msb? loop nip ;

: encode  \ a -- n
  0 swap ( 1 swap n:shl n:bor ) a:each! drop ;

' noop 1 40 a:generate ( a:shuffle 0 7 a:slice encode ) curry: arvo-rivi

: app:main
  arvo-rivi arvo-rivi
  2dup decode . cr  decode . cr cr
  2dup "%2@041d\n%2@041d\n" s:strfmt .
  41 b:new true b:writable '- b:fill >s . cr
  n:band dup "%2@041d\n\n" s:strfmt .
  bits-set? "Numeroa oikein: %d\n" s:strfmt . ;
root@DietPi:~# /opt/8th/bin/rpi64/8th lotto.8th
 [8,9,21,27,31,35,40]
 [6,7,8,9,11,20,27]

10000100010001000001000000000001100000000
00000000000001000000100000000101111000000
-----------------------------------------
00000000000001000000000000000001100000000

Numeroa oikein: 3
root@DietPi:~#

Grez [31.01.2023 21:30:40]

#

PetriKeckman kirjoitti:

Lievän uhkapeliaddiktion omaavana tiedän, että uhkapelit eivät kannata, kasino voittaa aina ja lotosta puhuttaessa Oy Veikaus Ab...

Jännä muuten tuo Oy Veikkaus Ab kun väittävät olevansa vastuullisia mutta kuitenkin toimivat monin tavoin uhkapeliaddiktioita ruokkien.

Ajatellaan loton mainosta, jossa sanotaan "Jos et veikkaa, et voi voittaa". Lotossa noin joka 11. rivi voittaa, niin mielestäni olisi kohtuullista että joka 11. mainoskerralla olisi tuo nykyinen ja loput kymmenen yhdestätoista olisi "Jos et veikkaa, et voi hävitä".

Tai jos ajatellaan kolikkoautomaatteja niin jos rahat menee niin kone ei sano "hävisit 1 euroa" (1 euron panoksella) ja jos saa rahansa takaisin se ei sano "jäit omillesi" vaan "voitit 1 euroa" tai jos saa 1 euron voittoa niin se sanoo "voitit 2 euroa". Eli kone valehtelee minkä kerkeää ja puhuu vaan voittamisesta. Todellisuudessa pitäisi joka kierroksen alkaessa tulla ilmoitus "hävisit 1 euron" (jos se on panos) niin silloin nuo laitteen ilmoitukset nykymuodossaan olisi paikkansapitäviä.

PetriKeckman [31.01.2023 21:44:44]

#

jalski kirjoitti:

Mikset käsittelisi lottorivejä bitteinä?

Vaihdoin jo Pascaliin. Siinä saa tyypitettyä mahdollisimman pieniksi lottonumeron:

numero = 1..40;

Ja niiden lukumäärän:

ind = 1..7;

Jne...Pascal kääntäjä änkenee noi mahdollisimman pieneen tilaan? Ja muuten:

Kääntäjälle kelpasi tällainenkin ARRAY:

rivit : ARRAY [1..maxind,1..7] OF numero;

Missä maxind:

CONST maxind=2147483647;

Eli eiköhän muistitila riitä. Siis tuossa jo liioitellaan, kun erilaisia lottorivejä on vain noin jotain 15 miljoonaa, muistaakseni.

Grez [31.01.2023 21:46:19]

#

PetriKeckman kirjoitti:

erilaisia lottorivejä on vain noin jotain 15 miljoonaa, muistaakseni.

Niitä on 40!/(40-7)!=7! = 18 643 560

Silloin kun arvottiin vaan 39 numeroa, niitä oli 15 380 937

PetriKeckman kirjoitti:

Pascal kääntäjä änkenee noi mahdollisimman pieneen tilaan?

Todennäköisemmin kuitenkin sellaiseen tilaan, joka ei ole aivan pienin mahdollinen, mutta nopea käsitellä. Tai ainakin käyttäjän olisi syytä saada valita halutaanko mahdollisimman pientä muistin kulutusta vai suorituksen nopeutta. Eli esim. 8 bittiä per numero (7 tavua per rivi) on luultavasti nopeampaa pyöritellä kuin 5,322 bittiä per numero (4,66 tavua per rivi).

PetriKeckman [31.01.2023 22:27:55]

#

Grez kirjoitti:

Jännä muuten tuo Oy Veikkaus Ab kun väittävät olevansa vastuullisia mutta kuitenkin toimivat monin tavoin uhkapeliaddiktioita ruokkien.

Veikkaus Oy on siitäkin jännä, että sen palautusprosentit ovat niin alhaisia. Nettikasinoilla on paremmat, mutta en silti suosittele kokeilemaan...

Voitin kyllä kerran yli 3000 euroa. Satuin ottamaan pelisession videolle:

https://youtu.be/ZialMk6QHts

Ja ihme ja kumma! En innostunut jatkamaan peliä, vaan ostin uuden tietsikan, sohvan, sängyn, maton, vaatteita jne...

PetriKeckman [01.02.2023 13:10:29]

#

Grez kirjoitti:

Tätä aihetta on mietitty aiemminkin:
https://www.ohjelmointiputka.net/keskustelu/31998-lottorivijoukkojen-generointi

Tuossa ketjussa todettiin vastauksen olevan todennäköisesti välillä [329,379]

Pascal ohjelmani ei sentään kaadu. Likiarvoja se tosin vain tuottaa - ja nekin ehkä näyttävät olevan sitten ihan vääriä? Kun siis saan ängettyä tähän taulukkoon:

rivit : ARRAY [1..maxind] OF ARRAY[1..7] OF numero;

605 eri riviä, joissa on keskenään korkeintaan (EDIT: Heh! Taas sekaisin, siis vähintään! Eiku miten se pitäisi sanoa?) 4 oikein. Menen kyl itsekin yhtenään sekaisin ohjelmani logiikasta, siksi yritin juurta jaksain sen kirjoittaa ohjelman alkuun. En ole lukenut vielä pohdintojanne, täytyis jaksaa lukea.

EDIT2: Siis näin se kai menee: sain ängettyä 605 sellaista riviä, joissa oli enintään kolme oikein, jonka jälkeen oikein muutttujaa oli nostettava 4:een ja otettiin talteen rivind muuttujan arvo? Vai meneekö näinkään? Olen pahoillani, mut mä oon vähän sekaisin nyt :) Tuon yrityksia muuttujan arvoa olisi siis nostettava ts. kerrottava sitä isommalla luvulla kuin kaksi, silloin kun aletaan tutkimaan seuraava määrää.

:\Tiede\lotto>väkisin
Vähintään 1 saa noin 5 rivilla.
Vähintään 2 saa noin 13 rivilla.
Vähintään 3 saa noin 68 rivilla.
Vähintään 4 saa noin 605 rivilla.
{Miten vakisin oik kpl oikein lotossa?}
{Ohjelman idea: ensin yritetään änkeä lottorivejä rivit taulukkoon,}
{joissa saa olla vain oikein-muuttujan verran samoja numeroita minkään}
{edellisen taulukon lottorivin kanssa. Aluksi oikein=0. Siis yritetään }
{aikaan saada mahdollisimman monta riviä, joissa on vain nolla oikein }
{edellisten rivien kanssa. Jokin yläraja yrityksillä täytyy olla: se on }
{muuttujan yrityksia arvo. Kun rivejä ei saada enää ängettyä, on pakko nostaa}
{oikein muuttujan arvoa. Samalla ollaan saatu selville likiarvo sille, kuinka }
{monta erilaista riviä, joissa on vain oik muuttujan verran samoja numeroita }
{edellisten kanssa eli kuinka monta riviä tarvitaan, että on vähintään oik oikein}
Program erilaisia;
uses Crt;

CONST
    maxind=18643560; {Erilaisten lottorievien määrä}
TYPE  numero = 1..40;
	taulukonindeksi = 1..maxind;
VAR
    lottonumero:    numero;
    lottorivi: ARRAY[1..7] OF numero;
    rivit      :   ARRAY [1..maxind] OF ARRAY[1..7] OF numero; {taulukko erilaisille lottoriveille}
    rivind		: 0..maxind; {viittaa  taulukon indeksiin so. siihen lukumaaraan kuinka monta rivia taulukkoon ollaan laitettu}
    yrityksia  :   LongInt; {monta kertaa yritetaan tuottaa riveja, joissa vain oik kpl samoja edellisten kanssa kunnes luovutetaan}
    oikein			:	Integer; {Monta saa olla oikein. Aluksi ei saa olla yhtaan oikein!}
    yritys: 0..maxind;
    lkm: 0..7; {Jo tuotettujen lottonumeroiden maara kun arvotaan rivia}
FUNCTION eiloydy(num: numero):BOOLEAN; {tutkitaan loytyyko arvottu numero jo lottorivista}
VAR ind: 1..7;
	loytyy: BOOLEAN;
BEGIN
	loytyy:=FALSE;
	FOR ind:=1 TO lkm DO
		IF lottorivi[ind]=num THEN loytyy:=TRUE;
	eiloydy:=NOT loytyy;
END;
PROCEDURE Arvorivi;
BEGIN
	lkm:=0;
	REPEAT
		lottonumero:=Random(40)+1;
		IF eiloydy(lottonumero) THEN
			BEGIN
				lottorivi[lkm + 1]:=lottonumero;
				lkm:=lkm+1;
			END;
	UNTIL lkm = 7;
END;
FUNCTION eioopantu:BOOLEAN; {onko pantu jo? - vaiko ei oo pantu;) - siis arvottua lottorivia taulukkoon rivit}
VAR ei : BOOLEAN;
	ind : 1..maxind;
	lkm, numeroind,numeroind2	: 0..7;
BEGIN
	ei:=TRUE;
	IF rivind=0 THEN {rivit taulukossa ei ole vielä yhtään riviä}
		BEGIN
			eioopantu:=TRUE;
			exit;
		END;

	FOR ind:=1 TO rivind DO {kaydaan kaikki rivit taulukon alkiot lapi}
		BEGIN
			lkm:=0;
			FOR numeroind:=1 TO 7 DO
				FOR numeroind2:=1 TO 7 DO
					IF lottorivi[numeroind] = rivit[ind,numeroind2] THEN lkm:=lkm+1;
		END;
	IF lkm = 7 THEN ei:=FALSE {eli ollaan jo pantu}
	ELSE ei:=TRUE;
	{WRITELN(lkm);}
	eioopantu:=ei;
END;
FUNCTION enitenoikein:taulukonindeksi; {kay lapi kaikki jo lotatut rivit ja palauttaa suurimman oikeiden numeroiden}
{lukumaaran arvotun rivin kanssa}
VAR ind : 1..maxind;
	maxlkm, lkm, numind,numind2:0..7;
BEGIN
	maxlkm:=0;
	FOR ind:=1 TO rivind DO
		BEGIN
			lkm:=0;
			FOR numind:=1 TO 7 DO {numind on arvotun lottorivin numeron indeksi}
					FOR numind2:=1 TO 7 DO {numind2 on rivit taulukon numeron indeksi}
							IF lottorivi[numind]=rivit[ind,numind2] THEN lkm:=lkm+1;
			IF lkm > maxlkm THEN maxlkm:=lkm;
		END;
		{Writeln('Eniten oikein ','  ',maxlkm);}
	enitenoikein:=maxlkm;
END;
BEGIN
	oikein:=0; {Aluksi tuotetaan mahdollisimman monta rivia joissa 0 oikein edellisten kanssa}
	yrityksia:=100000; {Yritetaan aluksi tuottaa 100 tuhatta sellaisia riveja, joissa ei ole yhtaan}
		{oikein jo lotattujen rivien kanssa. Tietysti niitä on vain viisi, mutta pelataan }
		{varman päälle! - tiedä, jos jostain jokin porsaan reikä löytyisi :) }
	Randomize;
	rivind:=0;
	REPEAT
		yritys:=0;
		REPEAT
			Arvorivi;
			IF (enitenoikein = oikein) THEN  {arvottu rivi kelpaa vietavaksi rivit taulukkoon...}
				BEGIN
					IF eioopantu THEN {.. Pannaan, jos ei olla jo pantu...}
						BEGIN
							rivind:=rivind+1;
							rivit[rivind]:=lottorivi;;
						END;
				END;
			yritys:= yritys+1;
			{Writeln('Yritys ', yritys);}
		UNTIL yritys >= yrityksia;
		WRITELN('Vähintään ', oikein+1, ' saa noin ', rivind, ' rivilla.');
		oikein:=oikein+1;
		yrityksia:=yrityksia*2;
	UNTIL oikein = 7;
END.

PetriKeckman [01.02.2023 14:22:18]

#

Kertokaapas viisaammat kuhan kerkeätte, että pitäiskö tätä ehtoa muuttaa:

IF eioopantu THEN {.. Pannaan, jos ei olla jo pantu...}

Siis nyt rivit taulukkoon ei panna arvottua riviä, jos se on täsmälleen sama kuin jokin aikaisempi. Rivit taulukon alkioiden ts. lottorien määrä kasvaa äkkiä tällöin turhaan suureksi, sillä aina kun uusi lottorivi ollaan arvottu, niin joudutaan käymään koko rivit taulukko läpi, ettei sinne nyt sentään ihan samaa riviä laiteta toiste.

Mutta jos olemme vaikkapa tarkastelemassa tilannetta muuttujan oik arvolla 3, niin eikö silloin kannattaisi laittaa arvottua lottoriviä rivit taulukkoon vain jos siinä on enintään 4 oikein jonkin aikaisemman kanssa? Näin ei rivit taulukon lottorivien lukumäärä kasva turhan suureksi ja ohjelman ajoaika kasva tähtitieteelliseksi?

Tää on ihan mutu pohdiskelua...

EDIT: Eihän mun logiikassa oo päätä eikä häntää!!! ensin tutkin ehdolla:

IF (enitenoikein = oikein) THEN  {arvottu rivi kelpaa vietavaksi rivit taulukkoon...}

Että onko arvotulla lottorivillä oikein määrä samoja numeroita minkään jo rivit taulukkoon laitetun rivin kanssa ja sitten alan vielä tutkimaan, että onko se täsmälleen sama kuin jokin siellä!!

Tää urakka jää nyt telakalle vähäks aikaa, ku ei tästä tuu mitään! Alan keskittyy muihin hommiin.

jalski [01.02.2023 17:37:08]

#

Kokeilin nopeasti piruuttani lottoriviä 10 miljoonassa arvonnassa:

Rivillä numeroita 0 kpl oikein 2291365 kertaa.
Rivillä numeroita 5 kpl oikein 5944 kertaa.
Rivillä numeroita 6 kpl oikein 128 kertaa.
Rivillä numeroita 3 kpl oikein 767192 kertaa.
Rivillä numeroita 4 kpl oikein 102072 kertaa.
Rivillä numeroita 1 kpl oikein 4157312 kertaa.
Rivillä numeroita 2 kpl oikein 2675987 kertaa.

PetriKeckman [01.02.2023 19:10:21]

#

jalski kirjoitti:

Kokeilin nopeasti piruuttani lottoriviä 10 miljoonassa arvonnassa:

Mä vaihdoin taktiikkaa. Ajattelin tuottaa KAIKKI eri lottorivit ja tutkia, kuinka monessa niistä on 0,1,2,3,4,5,6 ja 7 oikein yhden arvotun rivin kanssa. En ihan vielä tiedä mihin olen pyrkimässä :) Mutta en tajua! Tämä ohjelmani ei edes kaadu! Se vain palautuu komentoriville ts. se ei koskaan toteuta pääohjelmassa olevaa käskyä:

WRITELN('Tuotto valmis');

Loppuuko muisti? Eikö siitä pitäisi tulla virheilmoitus? En tiedä, mistä ja miten lähtisin virhettä etsimään?

{Ohjelman idea: Laitetaan KAIKKI erilaiset rivit taulukkoon. Tuotetaan yksi mikä tahansa}
{rivi. Tutkitaan, kuinka oikein-muuttujan arvon 1..7 kanssa sillä on tasan oikein kpl oikein.}
Program todennakoisyydet;
uses Crt;
CONST
    maxind=18643560; {Erilaisten lottorievien määrä}
TYPE  numero = 1..40;
	rivit = 0..maxind;
	oikeita = 1..7;
VAR
    lottonumero:    numero;
    lottorivi: ARRAY[1..7] OF numero;
    kaikkirivit      :   ARRAY [1..maxind] OF ARRAY[1..7] OF numero; {taulukko kaikille erilaisille lottoriveille}
    rivind		: 0..maxind;
    oikein			:	Integer; {Monta saa olla oikein. Aluksi ei saa olla yhtaan oikein!}
    lkm: 0..7; {Jo tuotettujen lottonumeroiden maara kun arvotaan rivia}
FUNCTION montaoikein:oikeita; {Monta arvotussa rivissä ja rivissä kaikkirivit[rivind] samoja?}
VAR i,j: 1..7;
	oikeinapu: 0..7;
BEGIN
	oikeinapu:=0;
	FOR i:=1 TO 7 DO
		FOR j:=1 TO 7 DO
			IF lottorivi[i]=kaikkirivit[rivind,j] THEN
					oikeinapu:=oikeinapu+1;
	montaoikein:=oikeinapu;
END;
FUNCTION Montariviajoissa(lkm:oikeita): rivit; {Palauttaa niitten rivien lukumäärän, joissa tasan lkm oikein arvotusta}
{Esimerkiksi löytyy vain yksi rivi, joissa tasan 7 oikein}
{ lottorivistä}
VAR lukumaara: rivit;
BEGIN
	lukumaara:=0;
	FOR rivind:=1 to maxind DO
		IF montaoikein=lkm THEN lukumaara:=lukumaara+1;
	Montariviajoissa:=lukumaara;
END;
FUNCTION eiloydy(num: numero):BOOLEAN; {tutkitaan loytyyko arvottu numero jo lottorivista}
VAR ind: 1..7;
	loytyy: BOOLEAN;
BEGIN
	loytyy:=FALSE;
	FOR ind:=1 TO lkm DO
		IF lottorivi[ind]=num THEN loytyy:=TRUE;
	eiloydy:=NOT loytyy;
END;
PROCEDURE Arvorivi;
BEGIN
	lkm:=0;
	REPEAT
		lottonumero:=Random(40)+1;
		IF eiloydy(lottonumero) THEN
			BEGIN
				lottorivi[lkm + 1]:=lottonumero;
				lkm:=lkm+1;
			END;
	UNTIL lkm = 7;
END;
PROCEDURE TuotakaikkiMahdollisetRivit;
VAR n1,n2,n3,n4,n5,n6,n7: numero;
	i: 1..maxind;
	lottorivi: ARRAY[1..7] OF numero;
BEGIN
	i:=1;
	FOR n1:=1 TO 40 DO
			FOR n2:=1 TO 40 DO
				FOR n3:=1 TO 40 DO
					FOR n4:=1 TO 40 DO
						FOR n5:=1 TO 40 DO
								FOR n6:=1 TO 40 DO
									FOR n7:=1 TO 40 DO
										BEGIN
											lottorivi[1]:=n1;
											lottorivi[2]:=n2;
											lottorivi[3]:=n3;
											lottorivi[4]:=n4;
											lottorivi[5]:=n5;
											lottorivi[6]:=n6;
											lottorivi[7]:=n7;
											kaikkirivit[i]:=lottorivi;
											i:=i+1;
										END;
END;
BEGIN
	WRITELN('Tuotto alkaa');
	TuotakaikkiMahdollisetRivit;
	WRITELN('Tuotto valmis');
	Randomize;
	Arvorivi;
	FOR oikein:=0 TO 7 DO
			WRITELN('Rivejä, joissa ', oikein, ' oikein on ', Montariviajoissa(oikein),' kappaletta');
END.

PetriKeckman [01.02.2023 19:21:56]

#

Ja ****** tapani tuottaa kaikki eri rivit on ihan pa:sta. Nythän siellä voi, ja on, jokin rivi, missä on vaikka 7 kpl 7:aa :)

jalski [01.02.2023 19:37:00]

#

PetriKeckman kirjoitti:

Ja ****** tapani tuottaa kaikki eri rivit on ihan pa:sta. Nythän siellä voi, ja on, jokin rivi, missä on vaikka 7 kpl 7:aa :)

Netti onneksi pullollaan esimerkki koodeja permutaatioiden ja kombinaatioiden muodostamiseen! Laitat nuo numerot 1 - 40 taulukkoon ja muodostat permutaatiot taulukon sisällöstä. Minulla itse tehty 8th toteutus minkä voin kokeeksi laittaa yöllä pyöräyttämään nuo kaikki permutaatiot.

PetriKeckman [01.02.2023 19:51:23]

#

jalski kirjoitti:

Netti onneksi pullollaan esimerkki koodeja permutaatioiden ja kombinaatioiden muodostamiseen!

En mä ehkä mitään nettiä käytä saatikka permutaatioita ja kombinaatioita ala opiskelemaan...Mä yritän tehdä sen omalla tavalla :) Luulis jonkinlaisen tällaisen toimivan?

PROCEDURE TuotakaikkiMahdollisetRivit;
VAR n1,n2,n3,n4,n5,n6,n7: numero;
	i: 1..maxind;
	lottorivi: ARRAY[1..7] OF numero;
BEGIN
	i:=1;
	FOR n1:=1 TO 40 DO
			FOR n2:=1 TO 40 DO
					IF n1 <> n2 THEN
							FOR n3:=1 TO 40 DO
								IF (n3<>n1) AND (n3<>n2) THEN
									FOR n4:=1 TO 40 DO
										IF (n4<>n3) AND (n4<>n2) AND (n4<>n1) THEN
											FOR n5:=1 TO 40 DO
												IF (n5<>n4) AND (n5<>n3) AND (n5<>n2) AND (n5<>n1) THEN
													FOR n6:=1 TO 40 DO
														IF (n6<>n5) AND (n6<>n4) AND (n6<>n3) AND (n6<>n2) AND (n6<>n1) THEN
															FOR n7:=1 TO 40 DO
																IF (n7<>n6) AND (n7<>n5) AND (n7<>n4) AND (n7<>n3) AND (n7<>n2) AND (n7<>n1) THEN
																BEGIN
																	lottorivi[1]:=n1;
																	lottorivi[2]:=n2;
																	lottorivi[3]:=n3;
																	lottorivi[4]:=n4;
																	lottorivi[5]:=n5;
																	lottorivi[6]:=n6;
																	lottorivi[7]:=n7;
																	kaikkirivit[i]:=lottorivi;
																	i:=i+1;
																END;
END;

jalski [01.02.2023 20:00:49]

#

PetriKeckman kirjoitti:

jalski kirjoitti:

Netti onneksi pullollaan esimerkki koodeja permutaatioiden ja kombinaatioiden muodostamiseen!

En mä ehkä mitään nettiä käytä saatikka permutaatioita ja kombinaatioita ala opiskelemaan...Mä yritän tehdä sen omalla tavalla :) Luulis jonkinlaisen tällaisen toimivan?

Älä tee noin! ;D Taulukon alkioiden sisältöjä keskenään vaihtamalla saat permutaatiot nätisti ja kivassa järjestyksessä ja varmasti nopeammin kuin hakuammuntana!

Matti Holopainen [01.02.2023 20:03:27]

#

Kokeilin joskus 60-luvun lopulla samanlaista ideaa veikkausriveille.

Tuolloin veikattiin 12 ottelua ja voittoluokat olivat 12, 11 ja 10 oikein. Tavoitteena oli tehdä 10 täysinvaihdellun ottelun (valinnat 1, x, 2) hajarivisysteemi, joka takasi voiton, jos ne kaksi systeemin ulkopuolelle jäävää ottelua eli "varmat" oli arvattu oikein. Jokaisen systeemiin lisätyn rivin piti erota kaikista muista systeemin riveistä vähintään 5 merkillä, jotta mahdollisimman suuri osa mahdollisista tulosriveistä (3 ^ 10 = 59049 riviä) tulisi peitetyksi.

Veikkauksen Valiosysteemit -kirjassa paras tällainen hajarivisysteemi oli kooltaan jotain useiden satojen ellei jopa tuhannen rivin luokkaa, en nyt tarkemmin muista. Teoreettisesti oli laskettavissa, että 243 riviä riittää. En enää muista sitäkään, kuinka tämä lasketaan.

Aloin sitten kehittämään vastaavaa ohjelmaa Algolilla ELLIOTT 803 B:llä ajettavaksi. 59049 rivin generoiminen ja testaaminen, eroaako rivi systeemissä jo olevista riveistä vähintään viidellä, kesti tuntikausia, vaikka valtaosa koodista oli koodattu konekielellä Algolin elliott-proseduuria käyttämällä.

Sain lopulta puoli tuntia Suomen nopeimman koneen ELLIOTT 503:n koneaikaa ja lopputulos oli muistaakseni kyllä parempi kuin Veikkauksen kirjassa, mutta ei lähelläkään tuota teoreettista 243 rivin minimimäärää. Kokeilin lisätä rivejä "numerojärjestyksessä" ja satunnaisessa järjestyksessä, mutta tästä ei ollut apua.

Joskus 80-luvulla eräs jyväskyläläinen matemaatikko sitten kehitti ryhmäteorian avulla tuon teoreettisen minimisarakemääräisen systeemin, luultavasti ilman tietokoneen apua.

Ryhmäteoriasta olisi varmasti hyötyä myös tässä lottoprojektissa.

Matti Holopainen [01.02.2023 20:22:46]

#

Taisinpa löytää tuon matemaatikon: Heikki Hämäläinen. Verkosta löytyi aihetta sivuava julkaisu: https://core.ac.uk/download/pdf/81956883.pdf

Metabolix [01.02.2023 21:39:36]

#

PetriKeckman kirjoitti:

Ajattelin tuottaa KAIKKI eri lottorivit

Petri, yleisesti kun numeroiden järjestyksellä ei ole väliä, järkevä silmukka onnistuu ilman iffiä ja numerotkin ovat suoraan suuruusjärjestyksessä:

for n7 := 7 to 40 do
  for n6 := 6 to n7 - 1 do
    jne;

Jos tuotat liikaa rivejä (kuten samat numerot monessa järjestyksessä), taulukkosi ylittyy. Mitä silloin käy, riippuu kääntäjästä ja asetuksista, mutta ohjelman sammuminen on yksi vaihtoehto kyllä.

PetriKeckman kirjoitti:

ja tutkia, kuinka monessa niistä on 0,1,2,3,4,5,6 ja 7 oikein yhden arvotun rivin kanssa.

Tätä voi huomattavasti helpottaa päättämällä valmiiksi, että arvottu rivi on 1234567.

Myös matematiikan käyttö on suotavaa, jos ratkoo matemaattista ongelmaa. Eri voittorivien määrä ratkeaa suoraan tavallisella kombinaatiokaavalla. Erilaisten neljä oikein -rivien määrä saadaan laskemalla, monellako tavalla voidaan valita neljä seitsemästä kertaa monellako tavalla kolme lopuista 33:sta. Eli (7 yli 4)*(33 yli 3) = 190960.

Tämä tieto ei valitettavasti auta suoraan aiemmassa kysymyksessä, montako riviä tarvitaan varmaan osumaan.

PetriKeckman [02.02.2023 02:52:04]

#

Grez kirjoitti:

Myös yksi oikein on helppo. Rivejä tarvitaan vähintään (40-6)/7 eli viisi, koska osittaisia rivejä ei voi tehdä.

Aloin manuaalisesti tuottamaan mahdollisimman erilaisia rivejä:

1. 1   2  3  4  5  6  7
2. 8   9 10 11 12 13 14
3. 15 16 17 18 19 20 21
4. 22 23 24 25 26 27 28
5. 29 30 31 32 33 34 35
6. 36 37 38 39 40  1 8

Minusta vasta kuudennessa on väkisin 1 kpl oikein...?

PetriKeckman [02.02.2023 05:56:34]

#

Ohjelmalla, joka näyttää ainakin aluksi, että voisi toimiakin oikein, päädyin tulokseen, että neljä oikein saadaan väkisin tasan 266:lla (267 taitaa ollakin) rivillä. Eli ohjelmassani on ajatusvirhe?

Tulostuksen alkua:

E:\Tiede\lotto>erilaisia
Tuotto alkaa
Tuotto valmis
Seuraavaksi luetellaan ne, joissa 0 oikein. Rivejä tähän asti 1
1:    8     9    10    11    12    13    14
2:   15    16    17    18    19    20    21
3:   22    23    24    25    26    27    28
4:   29    30    31    32    33    34    35
Seuraavaksi luetellaan ne, joissa 1 oikein. Rivejä tähän asti 5
5:    1     8    15    22    29    36    37
6:    2     9    16    23    30    36    38
7:    3    10    17    24    31    37    38
8:    4    11    18    25    31    36    39
9:    5    12    19    26    30    37    39
10:    6    13    20    27    29    38    39
11:    7    13    19    24    32    36    40
12:    6    14    18    23    33    37    40
13:    5    11    21    22    34    38    40
14:    3     9    15    28    35    39    40

E:\Tiede\lotto>

Ja tulostuksen loppua:

259:    2     4     7    19    25    35    40
260:    3     6     7    11    30    36    40
261:    1     5     6    12    33    36    40
262:    1     5     7    31    34    37    40
263:    1     2     4    17    18    38    40
264:    4     5     6    27    28    38    40
265:    2     3     7     8    22    39    40
266:    2     5     6    20    35    39    40

E:\Tiede\lotto>

Ja itse ohjelma:

{}
Program erilaisia;
uses Crt;
CONST
    maxind=18643560; {Erilaisten lottorievien määrä}
TYPE  numero = 1..40;
	rivit = 0..maxind;
	oikeita = 1..7;
	rivi =  ARRAY[1..7] OF numero;
VAR
    siemenrivi,rivi2: rivi;
    kaikkirivit,
    madollisimmanerilaiset {Kerätään tähän taulukkoon mahdollisimman erilaisia rivejä. Aluksi siis niitä joissa}
    {on aiemmin siellä olevien kanssa kanssa vain 0 oikein. Sitten 1, 2 jne...}
    					:   ARRAY [1..maxind+1] OF ARRAY[1..7] OF numero;
    rivind		: 0..maxind;
    i: 0..7; {Jo tuotettujen lottonumeroiden maara kun arvotaan rivia}
    ii,kk: 1..maxind;
    samojenmaara: 0..7;
    on: BOOLEAN;
FUNCTION samoja(a,b: rivi):oikeita; {Monta rivissä a ja b samoja?}
VAR i,j: 1..7;
	oikeinapu: 0..7;
BEGIN
	oikeinapu:=0;
	FOR i:=1 TO 7 DO
		FOR j:=1 TO 7 DO
			IF a[i]=b[j] THEN
					oikeinapu:=oikeinapu+1;
	samoja:=oikeinapu;
END;
PROCEDURE TuotakaikkiMahdollisetRivit;
VAR n1,n2,n3,n4,n5,n6,n7: numero;
	lottorivi: ARRAY[1..7] OF numero;
BEGIN
	ii:=1;
	FOR n7 := 7 TO 40 DO
  		FOR n6 := 6 TO n7 - 1 DO
  			FOR n5 := 5 TO n6 - 1 DO
  				FOR n4 := 4 TO n5 - 1 DO
  					FOR n3 := 3 TO n4 - 1 DO
  						FOR n2 := 2 TO n3 - 1 DO
  							FOR n1 := 1 TO n2 - 1 DO
								BEGIN
									lottorivi[1]:=n1;
									lottorivi[2]:=n2;
									lottorivi[3]:=n3;
									lottorivi[4]:=n4;
									lottorivi[5]:=n5;
									lottorivi[6]:=n6;
									lottorivi[7]:=n7;

									kaikkirivit[ii]:=lottorivi;
									{FOR j:=1 TO 7 DO WRITE(lottorivi[j]:4, '  ');
									WRITELN(' ');}
									ii:=ii+1;
									{IF i=20 THEN exit;}
								END;
END;
BEGIN
	WRITELN('Tuotto alkaa');
	TuotakaikkiMahdollisetRivit;
	WRITELN('Tuotto valmis');
	FOR i:=1 TO 7 DO siemenrivi[i]:=i;
	madollisimmanerilaiset[1]:=siemenrivi;
	rivind:=1;
	FOR samojenmaara:=0 TO 3 DO
		BEGIN
			WRITELN('Seuraavaksi luetellaan ne, joissa ',samojenmaara,' oikein. Rivejä tähän asti ', rivind);
			FOR ii:=1 TO maxind DO {Käydään läpi kaikki rivit ja hyväksytään niistä vain ne,}
				BEGIN
					rivi2:=kaikkirivit[ii];
					IF samoja(siemenrivi,rivi2)=samojenmaara THEN {joissa on samoja oikein muuttujan sanojen määrä,}
						BEGIN
							{Onko myös jo minkä tahansa taulukkoon mahdollisimmanerilaisetrivit laitetun}
							{rivin kanssa vain samojenmaara oikein?}
							on:=TRUE;
							FOR kk:=1 TO rivind DO IF samoja(madollisimmanerilaiset[kk],rivi2)>samojenmaara THEN on:=FALSE;
								IF on THEN {rivi2 kelpaa mahdollisimmanerilaiset rivit taulukkoon}
									BEGIN
										WRITE(rivind,': ');
										FOR i:=1 TO 7 DO WRITE (rivi2[i]:4, '  ');
										WRITELN(' ');
										madollisimmanerilaiset[rivind]:=rivi2;
										rivind:=rivind+1;
									END;
						END;
				END;
		END;
END.

Grez [02.02.2023 08:45:46]

#

PetriKeckman kirjoitti:

Ohjelmalla, joka näyttää ainakin aluksi, että voisi toimiakin oikein, päädyin tulokseen, että neljä oikein saadaan väkisin tasan 266:lla (267 taitaa ollakin) rivillä. Eli ohjelmassani on ajatusvirhe?

No sähän voit kokeilla sitä. Vaihda että käytetään vaan numeroita 1-39 (jolloin rivi määrän pitäisi olla kaiken järjen mukaan sama tai pienempi) ja tuuppaa rivit tuonne https://www.ohjelmointiputka.net/postit/tehtava.php?tunnus=lottov

Jos se menee läpi niin ohjelmasi on toiminut oikein ja sinulla on paras tulos kaikista osallistujista (266 tai pienempi kun nykyään 329 on paras)

Sinänsä kyllä veikkaan että siinä on paha ajatusvirhe kun ilmeisesti tuo 266 rivin setti sisältää rivejä joissa on 0 oikein ja 1 oikein jne.

Metabolix [02.02.2023 17:50:37]

#

Grez kirjoitti:

Myös yksi oikein on helppo. Rivejä tarvitaan vähintään (40-6)/7 eli viisi, koska osittaisia rivejä ei voi tehdä.

Tämän pitäisi olla (40+6)/7.

PetriKeckman kirjoitti:

Ohjelmalla, joka näyttää ainakin aluksi, että voisi toimiakin oikein, päädyin tulokseen, että neljä oikein saadaan väkisin tasan 266:lla (267 taitaa ollakin) rivillä. Eli ohjelmassani on ajatusvirhe?

Ohjelmasi kylläkin tuottaa tiedon, monessako eri rivissä on 0-3 oikein ja enintään sama määrä yhteisiä minkään aiemman rivin kanssa. En näe tällä mitään loogista yhteyttä siihen, millä saisi 4 oikein, kun aivan nimenomaan yksikään noista ei sisällä neljää oikein.

Grez [02.02.2023 20:34:52]

#

Metabolix kirjoitti:

Tämän pitäisi olla (40+6)/7.

Tähän kaipaisin perusteluja. Mielestäni (40-6)/7 eli viisi riviä riittää, esimerkiksi rivit:
1,2,3,4,5,6,7
8,9,10,11,12,13,14
15,16,17,18,19,20,21
22,23,24,25,26,27,28
29,30,31,32,33,34,35

Mielelläni kuulisin millaisella arvotulla lottorivillä tuosta ei muka tule vähintään yksi oikein.

PetriKeckman [02.02.2023 20:42:01]

#

Grez kirjoitti:

Tähän kaipaisin perusteluja. Mielestäni (40...

Tosiaan! Vaikka tuossa on jo viisi riviä, niin vasta siinä kuudennessa, joka olisi se arvottu epäsopivin rivi tulisi väkisin yksi oikein noiiden viiden kanssa. Me oltiin Metabolixin kanssa väärässä :) ?

PetriKeckman [02.02.2023 20:47:12]

#

Metabolix kirjoitti:

En näe tällä mitään loogista yhteyttä siihen, millä saisi 4 oikein, kun aivan nimenomaan yksikään noista ei sisällä neljää oikein.

Ei niin sisälläkään, neljää oikein. Mutta mikä tahansa seuraava sisältäisi jo väkisin neljä oikein. Sellainen ohjelma oli ainakin tarkoitus tehdä, en tiedä olenko onnistunut. Siis ohjelma, joka tuottaa "mahdollisimman erilaisia rivejä". En ole ehtinyt paneutua tänään lisää tähän ohjelmaan, kun keskityin toisaalla olevan videon tekoon...

Metabolix [03.02.2023 03:29:07]

#

PetriKeckman kirjoitti:

Mutta mikä tahansa seuraava sisältäisi jo väkisin neljä oikein.

Mitä jos ihan kokeilisit. Voit helposti lisätä loppuun koodin, joka tulostaa pari ensimmäistä riviä, jotka eivät sisällä neljää oikein verrattuna mihinkään edelliseen. Nythän koodisi tuottaa rivejä, joissa on jotain oikein riviin 1-7 nähden, joten muilla voittoriveillä systeemisi ei ole kovin kattava.

Grez kirjoitti:

Metabolix kirjoitti:

Tämän pitäisi olla (40+6)/7.

Tähän kaipaisin perusteluja.

Harhauduin sanallisesti esitetystä ylös pyöristämisestä ja Petrin "aukottomasta" esimerkistä. :D Eli Petri tosiaan taisi arpoa vain yhden lottonumeron, ja kaavani koskee tätä vaihtoehtoa ja on puolestaan esitetty koodarin kokonaisluvuilla eli tuloksesta pudotetaan desimaalit pois (eli +6 on pyöristämistä varten).

Grez [03.02.2023 08:25:08]

#

Joo kokonaislukumatematiikalla kysymyksen "monellako rivillä lotossa saa varmasti väh. 1 oikein" kaava onkin äärimmäisen yksinkertainen: 40/7

PetriKeckman [13.08.2023 12:13:24]

#

Palaan tähän ongelmaan. Tein ohjelman, joka tuotti 961 kpl sellaista riviä, joissa keskenään on enintään kolme oikein. Sitten 962:nnessa rivissä olisikin väkisin neljä oikein.

Program erilaisia;
uses Crt,Sysutils;
CONST
    maxind=18643560; {Erilaisten lottorievien määrä}
TYPE  numero = 1..40;
	oikeita = 1..7;
	rivi =  ARRAY[1..7] OF numero;
VAR
    indeksi: 1..maxind;
    i1, {osoittaa riviin jota tarkastellaan kaikista riveistä}
    i2: 1..maxind;
    samojenmaara: 0..7;
    kaikkirivit, tuotetutrivit: ARRAY [1..maxind] OF rivi;
    rivi2 : rivi;
    i:oikeita;
    F: TextFile;
FUNCTION samoja(a,b: rivi):oikeita; {Monta rivissä a ja b samoja?}
VAR i,j: 1..7;
	oikeinapu: 0..7;
BEGIN
	oikeinapu:=0;
	FOR i:=1 TO 7 DO
		FOR j:=1 TO 7 DO
			IF a[i]=b[j] THEN
				oikeinapu:=oikeinapu+1;
	samoja:=oikeinapu;
END;
PROCEDURE TuotakaikkiMahdollisetRivit;
VAR n1,n2,n3,n4,n5,n6,n7: numero;
	lottorivi: rivi;
	ii: 1..maxind;
BEGIN
	ii:=1;
	FOR n7 := 7 TO 40 DO
  		FOR n6 := 6 TO n7 - 1 DO
  			FOR n5 := 5 TO n6 - 1 DO
  				FOR n4 := 4 TO n5 - 1 DO
  					FOR n3 := 3 TO n4 - 1 DO
  						FOR n2 := 2 TO n3 - 1 DO
  							FOR n1 := 1 TO n2 - 1 DO
								BEGIN
									lottorivi[1]:=n1;
									lottorivi[2]:=n2;
									lottorivi[3]:=n3;
									lottorivi[4]:=n4;
									lottorivi[5]:=n5;
									lottorivi[6]:=n6;
									lottorivi[7]:=n7;
									kaikkirivit[ii]:=lottorivi;
									ii:=ii+1;
								END;
END;
FUNCTION enitensamoja(riviparam:rivi):oikeita; {kuinka monta samaa jonkin jo tuotetun rivin kanssa?}
VAR samojakpl, monta: 0..7;
	ind : 1..maxind;
BEGIN;
	samojakpl:=0;
	FOR ind:=1 TO indeksi DO
		BEGIN
			monta:=samoja(riviparam,tuotetutrivit[ind]);
			IF monta > samojakpl THEN samojakpl:=monta;
		END;
	enitensamoja:=samojakpl;
END;
BEGIN
	WRITELN('Tuotto alkaa');
	TuotakaikkiMahdollisetRivit;
	WRITELN('Tuotto valmis');
	indeksi:=1;
	Assign(F,'rivit.txt');
	Rewrite(F);
	samojenmaara:=3;
	WRITELN('Luetellaan ne, joissa ',samojenmaara,' oikein keskenään.');
	FOR i1:=1 TO maxind DO {Käydään läpi kaikki rivit ja hyväksytään niistä vain ne,}
		FOR i2:=1 TO maxind DO {joissa samojenmaara on vähemmän tai sama kuin samojenmaara}
			BEGIN
				rivi2:=kaikkirivit[i2];
				IF enitensamoja(rivi2)<=samojenmaara THEN
					BEGIN
						WRITE(indeksi,': ');
						FOR i:=1 TO 7 DO WRITE (rivi2[i]:4, '  ');
						WRITELN(' ');
						WRITE(F,indeksi,': ');
						FOR i:=1 TO 7 DO WRITE (F,rivi2[i]:4, '  ');
						WRITELN(F,' ');
						tuotetutrivit[indeksi]:=rivi2;
						indeksi:=indeksi+1;
					END;
			END;
	Close(F);
END.

Aluksi kokeilin ohjelmaa arvolla:

samojenmaara:=0;

Jolloin se tuotti nätisti viisi oikeaa riviä:

Luetellaan ne, joissa 0 oikein keskenään.

1:    1     2     3     4     5     6     7
2:    8     9    10    11    12    13    14
3:   15    16    17    18    19    20    21
4:   22    23    24    25    26    27    28
5:   29    30    31    32    33    34    35

En tosin jaksanut odottaa ohjelman loppumista. Minulle riitti, että se tuotti oikeat viisi riviä.

Sitten kokeilin ohjelmaa arvolla:

samojenmaara:=1;

Ja se tuotti nopeasti silmämääräisesti tarkasteltuna oikeat 25 kpl rivejä (ja jämähti, kun ei löytänyt 26:tta riviä).

Luetellaan ne, joissa 1 oikein keskenään.
1:    1     2     3     4     5     6     7
2:    1     8     9    10    11    12    13
3:    2     8    14    15    16    17    18
4:    3     9    14    19    20    21    22
5:    4    10    15    19    23    24    25
6:    5    11    16    20    23    26    27
7:    6    12    17    21    24    26    28
8:    7    13    18    22    25    27    28
9:    7    12    16    19    29    30    31
10:    6    13    15    20    29    32    33
11:    5    10    18    21    30    32    34
12:    4    11    17    22    31    33    34
13:    3     8    25    26    31    32    35
14:    2     9    24    27    30    33    35
15:    1    14    23    28    29    34    35
16:    3    11    18    24    29    36    37
17:    6     8    22    23    30    36    38
18:    1    15    21    27    31    37    38
19:    2    10    20    28    31    36    39
20:    4    13    14    26    30    37    39
21:    5     9    17    25    29    38    39
22:    7     9    15    26    34    36    40
23:    5     8    19    28    33    37    40
24:    4    12    18    20    35    38    40
25:    1    16    22    24    32    39    40

Toisin sanoen, tarvitaan vähintään 26 kpl rivejä, jotta olisi väkisin kaksi oikein.

Sitten lopulta ajoin ohjelmaa arvolla:

samojenmaara:=3;

Ja se tuotti 961 sellaista riviä, joissa on enintään kolme keskenään oikein. Ohjelman tuloste on tuolla:

https://www.petke.info/961rivia.txt (en taaskaan kylläkään odottanut ohjelman loppumista, mutta kyllä se melkein tunnin pyöri)

Ei olisi eka kerta kun logiikkani olisi väärää, missähän teen virheen?

Metabolix [13.08.2023 16:35:27]

#

Virheesi on se, että laitat riveille maksimimäärän yhteisiä numeroita (eli oletat, että pitäisi olla 1 sama numero kaikilla pelattavilla riveillä, jotta voisi saada 2 oikein arvonnassa). Tämä on väärä oletus ja tässä kohti siis koko ratkaisusi menee pieleen.

Virhe on helpointa osoittaa 2 oikein -tapauksessa: 40 lottonumeroa voi kattaa 6 lottorivillä (6×7=42), ja kun arvotaan 7 lottonumeroa, näistä 2 osuu väkisin samalle riville (koska rivejä on vain 6 ja jokainen numero osuu johonkin riviin).

Nykyinen ratkaisusi taas taitaa tuottaa suurimman mahdollisen valikoiman lottorivejä siten, että yhden rivin täysosuma ei tuota voittoa muilla riveillä.

PetriKeckman [01.09.2023 15:38:30]

#

ChatGPT puhuu IHAN höpöjä!

Lotto - Montako riviä?

User
Lotossa arvotaan 40:stä numerosta 7. Kuinka monta riviä tarvitaan, että tulisi pakosti neljä oikein? Luonnollisesti näiden rivien täytyy olla "mahdollisimman erilaisia".
ChatGPT

Jos Lotossa arvotaan 40 numerosta 7, niin ensimmäisenä voimme laskea kaikki mahdolliset erilaiset yhdistelmät, joilla voit valita 7 numeroa 40:stä. Tämä voidaan laskea yhdistelmien kaavalla:

C(40, 7) = 40! / (7!(40-7)!) = 40! / (7! * 33!)

Tässä "C(40, 7)" edustaa yhdistelmien lukumäärää, kun valitset 7 numeroa 40:stä.

Nyt kun haluat saada vähintään neljä numeroa oikein, harkitseuraavat skenaariot:

Neljä numeroa oikein ja kolme väärin:
Voimme valita 4 numeroa oikein C(7, 4) tavalla ja 3 numeroa väärin C(33, 3) tavalla.
Yhdistelmiä tällä skenaariolla: C(7, 4) * C(33, 3)

Viisi numeroa oikein ja kaksi väärin:
Voimme valita 5 numeroa oikein C(7, 5) tavalla ja 2 numeroa väärin C(33, 2) tavalla.
Yhdistelmiä tällä skenaariolla: C(7, 5) * C(33, 2)

Kuusi numeroa oikein ja yksi väärin:
Voimme valita 6 numeroa oikein C(7, 6) tavalla ja 1 numero väärin C(33, 1) tavalla.
Yhdistelmiä tällä skenaariolla: C(7, 6) * C(33, 1)

Seitsemän numeroa oikein:
Voimme valita kaikki 7 numeroa oikein C(7, 7) tavalla ja ei ole väärää numeroa.
Yhdistelmiä tällä skenaariolla: C(7, 7) * C(33, 0)

Nyt voimme laskea yhteen kaikki näiden skenaarioiden yhdistelmät, jotka antavat vähintään neljä numeroa oikein:

C(7, 4) * C(33, 3) + C(7, 5) * C(33, 2) + C(7, 6) * C(33, 1) + C(7, 7) * C(33, 0)

Laske tämä lauseke ja saat tarvittavien rivien määrän, jotta saat pakosti neljä numeroa oikein Lotossa.
User
En osaa laskea :( Laskisitko sinä?
ChatGPT

Tietenkin! Lasketaan tarvittavien rivien määrä, jotta saat pakosti neljä numeroa oikein Lotossa.

Käytetään aiemmin laskemaani kaavaa:

C(7, 4) * C(33, 3) + C(7, 5) * C(33, 2) + C(7, 6) * C(33, 1) + C(7, 7) * C(33, 0)

Lasketaan kunkin osan arvo:

C(7, 4) = 35
C(33, 3) = 5456
C(7, 5) = 21
C(33, 2) = 528
C(7, 6) = 7
C(33, 1) = 33
C(7, 7) = 1
C(33, 0) = 1

Nyt lasketaan näiden osien tulot ja summa:

(35 * 5456) + (21 * 528) + (7 * 33) + (1 * 1) = 190760 + 11088 + 231 + 1 = 201080

Joten tarvitset yhteensä 201,080 riviä, jotta saat pakosti neljä numeroa oikein Lotossa, kun arvotaan 40:stä numerosta 7.
User
Kuinka monella rivillä mielestäsi saadaan vähintään yksi oikein varmasti?
ChatGPT

Jos haluat varmasti saada vähintään yhden oikein Lotossa, kun arvotaan 40:stä numerosta 7, voit käyttää komplementti-periaatetta. Se tarkoittaa, että lasketaan ensin todennäköisyys, että et saa yhtään oikein, ja sitten vähennetään tämä todennäköisyys 1:stä saadaksesi todennäköisyyden saada vähintään yksi oikein.

Todennäköisyys, että et saa yhtään oikein, kun valitset yhden rivin, on seuraava:

Et saa yhtään oikein: 33/40 * 32/39 * 31/38 * 30/37 * 29/36 * 28/35 * 27/34

Nyt lasketaan tämän todennäköisyyden komplementti:

1 - (33/40 * 32/39 * 31/38 * 30/37 * 29/36 * 28/35 * 27/34) ˜ 0.9967

Joten, noin 99.67%:n todennäköisyydellä saat vähintään yhden oikein Lotossa yhdellä rivillä, kun arvotaan 40:stä numerosta 7. Voit olla varma tästä melkein kaikissa tapauksissa, kun ostat yhden rivin.
User
Kuinka monella rivillä saa väkisin vähintään kaksi oikein?
ChatGPT

Jos haluat varmasti saada vähintään kaksi numeroa oikein Lotossa, sinun on harkittava kaikkia mahdollisia tapoja, joilla voit valita 2 tai enemmän oikeaa numeroa. Voit laskea tämän käyttämällä komplementti-periaatetta.

Ensinnäkin, lasketaan todennäköisyys, että et saa kahta oikein yhdellä rivillä:

Todennäköisyys, että et saa kahta oikein = (33/40) * (32/39) * (30/38) * (29/37) * (28/36) * (27/35) * (26/34)

Huomaa, että tässä tapauksessa jätämme yhden numeron pois joka kierroksella, jotta varmistetaan, että emme saa kahta oikein.

Nyt voimme laskea komplementin ja selvittää, kuinka monella rivillä saat vähintään kaksi oikein:

1 - [(33/40) * (32/39) * (30/38) * (29/37) * (28/36) * (27/35) * (26/34)] ˜ 0.9453

Joten noin 94.53%:n todennäköisyydellä saat vähintään kaksi numeroa oikein yhdellä rivillä. Tämä tarkoittaa, että voit olla melko varma tästä melkein kaikissa tapauksissa, kun ostat yhden rivin. Voit myös laskea tarvittavien rivien määrän saadaksesi vähintään kaksi oikein korkeammalla varmuudella, mutta se vaatisi laskemista useilla eri kombinaatioilla, ja se voi olla monimutkaista.
User
En ole kiinnostunut todennäköisyyksistä, vaan erilaisten rivien generoinnista. Esimerkiksi väkisin yhden oikein saa riveillä (1,2,3,4,5,6,7), (8,9,10,11,12,13,14), (15,16,17,18,19,20,21) , (22,23,24,25,26,27,28), (29,30,31,32,33,34,35) eli viidellä rivillä. Samaa periaatetta käyttäen, mitkä ovat ne rivit joilla saa väkisin vähintään kaksi oikeaa numeroa, olkoon arvottu rivi sitten mikä tahansa?
ChatGPT

Ymmärrän, että haluat generoida erilaisia rivejä, jotka takaavat vähintään kaksi oikein. Voimme lähestyä tätä kysymystä tarkastelemalla erilaisia yhdistelmiä, jotka takaavat vähintään kaksi oikein. Käytetään komplementti-periaatetta jälleen, mutta tällä kertaa kiinnitämme huomiota erilaisiin tapoihin valita numerot.

Kun haluat varmasti vähintään kaksi oikein, voit ajatella seuraavasti: jos valitset 7 numerosta 2 väärin, sinun on oltava oikeassa kaikissa muissa numeroin valitsemissasi riveissä.

Alla on esimerkkejä riveistä, joilla voit varmistaa vähintään kaksi oikein:

(1, 2, x, y, z, a, b)
Tässä voit valita numerot x, y, z, a ja b 33 mahdollisesta numerosta, joten tässä on C(33, 5) erilaista tapaa.

(x, 3, 4, 5, 6, 7, y)
Voit valita numerot x ja y 33 mahdollisesta numerosta, joten tässä on C(33, 2) erilaista tapaa.

Kun laskemme yhteen nämä erilaiset vaihtoehdot, saamme yhteensä erilaisia rivejä, jotka takaavat vähintään kaksi oikein:

C(33, 5) + C(33, 2)

Nyt voimme laskea näiden arvot:

C(33, 5) = 33! / (5!(33-5)!) = 33! / (5! * 28!) ˜ 20,366,920

C(33, 2) = 33! / (2!(33-2)!) = 33! / (2! * 31!) ˜ 528

Yhteensä erilaisia rivejä, jotka takaavat vähintään kaksi oikein, on noin 20,366,920 + 528 = 20,367,448. Tämä on se määrä erilaisia rivejä, joilla voit varmistaa vähintään kaksi oikein, olkoon arvottu rivi sitten mikä tahansa.
User
Puhut ihan pötyä! Aikaisemmin sanoit, että väkisin neljä oikein tulee 201080:lla rivillä ja nyt väität, että tarvittaisiin 20367448 kpl rivejä, jotta saataisiin kaksi oikein!!
ChatGPT

Pahoittelen sekaannusta aiemmissa vastauksissani. Olin väärässä ja aiemmat vastaukseni eivät olleet oikeita. Antamasi laskelma oli oikea:

Väkisin neljä oikein tarvitaan noin 201,080 rivillä.
Väkisin kaksi oikein vaatii huomattavasti suuremman määrän rivejä.

Oikea vastaus väkisin kahdella oikein on edelleen:

C(7, 2) * C(33, 5) = 21 * 221,856 = 4,660,776

Joten tarvitaan noin 4,660,776 riviä varmistaaksesi vähintään kaksi oikein, kun arvotaan 40:stä numerosta 7. Pahoittelen aiempia virheitäni ja kiitos korjauksesta.

Metabolix [01.09.2023 17:52:41]

#

Ei pitäisi olla yllätys kenellekään, että ChatGPT on kielimalli eikä mikään vaikean matematiikan ratkaisija.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta