Seuraa 
Viestejä943
Liittynyt10.5.2014

Aloittelevan ohjelmoijan koodi voi paisua ylisuureksi, jos ei tajua heti pyöritellä eri mahdollisuuksia mielessään moneen kertaan tehdäkseen lyhyttä koodia.

Itse tein yhteen ScrollBariin kerran koodia 25000 riviä kunnes sain se vähennettyä 12000 riviin ja sitten vasta ryhdyin ajattelemaan asiaa ja lopulta koodi supistui 200 riiviin.

Myös oli minulla vaikeuksia lottopelin kanssa. Kuinka estää saman numeron toistuminen arvonnassa?
Jälleen sain supistettua satojen tai tuhansien rivien koodin muro-osaan entisestä.

Itselläni on 150 ruudun ruudukko, jonka alkiot ensin alustin nollaksi.
e101 on muuttuja, joka määrittää arvottavien numeroiden lukumäärän esim. 10 lukua arvotaan
150 ruudun ruudukosta.
apu2 muuttujaan merkitään ensin arvottavien numeroiden lukumäärä (esim. 10) ja aina kun tulee UUSI
numero (taulukossa nolla kohta), jota ei vielä ole arvottu vähenee apu2 arvo yhdellä kunnes se saavuttaa nollan.
Kun apu2 saavuttaa nollan on arvottu 10 eri lukua.

apu2 := e101

Do
riviluku =: Random (e101)+1;

if taulukko1(riviluku) = 0 then
apu2 = apu2-1;
talukko1(riviluku) = riviluku;
else
apu2=apu2;

Untill apu2 = 0;

Muita ja ehkä parempia tapoja suorittaa arvonta löytyy Googlettamalla mm.

https://www.ohjelmointiputka.net/koodivinkit/23858-qb-lotto

http://cs.stadia.fi/~silas/ohjelmointi/c_opas-_Paras_-2.html

En tietenkään voi taata, että tuo koodini toimii nopeasti jos arvotaan esim. 40 eri lukua 150
ruudun ruukosta. Tai peräti 70 eri lukua 150 ruudun ruukosta. Olen testanut sen vain
ruudukkokoolla 7 numeroa 39:stä, jossa se toimii tarpeeksi nopeasti. Se saattaa jäädä
looppiin jos arvotaan 130 eri lukua 150:stä. En viitsi tarkistaa. Ajattelin, että todennäköisyys
tuo kuitenkin suhteellisen nopeasti sen eri luvun, jota tarvitaan. Vaikka saatetaan
joutua suorittamaan arvonta jopa 10000-40000 kertaa.

Laitan tähän nyt vielä tuon linkissä olevan ohjelmointiputkan (Sami) koodin näkyville:

DO ' Tämä looppi estää samojen numeroiden tulemisen
uusinta = 0
FOR a = 1 TO arvottavia
FOR b = 1 TO arvottavia
IF a <> b THEN
IF numero(a) = numero(b) THEN
uusinta = 1
numero(a) = INT(RND * numeroita) + 1
END IF
END IF
NEXT
NEXT
LOOP WHILE uusinta = 1

Ehkä tämä koodi on tehokkaampi? En tiedä.

Kommentit (8)

Titanic
Seuraa 
Viestejä943
Liittynyt10.5.2014

Taisin katsoa väärästä tekstitiedostosta tuon koodipätkäni se onkin väärä alustava hahmotelma. Tässä on tuo oikea koodi:

 Randomize;

apu2 := ScrollBar2.Position;

Repeat

riviluku := Random(skrolli)+1;
     Begin
     if taulukko1[riviluku] = 0 then
     apu2 := apu2-1 else
     apu2 := apu2;
     end;

     taulukko1[riviluku] := riviluku;

Until apu2 = 0;
                         

Tässä tuo muuttuja skorlli on vissiin ruudukon koko eli 150 ja apu2 on arvottavien numeroiden lukumäärä esim. 10 lukua. Taulukko1 [1..150] alustetaan ensin nollaksi joka alkion osalta.

jjw
Seuraa 
Viestejä676
Liittynyt20.9.2010

Arvonta onnistuu ilman, että tarvitsee arpoa uudelleen esiintyneitä numeroita.
Ideana on, että arvotun numeron tilalle vaihdetaan taulukon viimeinen numero ja sitten taulukon kokoa pienennetään yhdellä.

Esimerkiksi nykyinen lotto, 7 numeroa 40:stä.

Alustetaan taulukko numerot (), jossa numerot 1-40
For i = 1 to 40
numerot ( i ) = i
Next

N=40

For i = 1 to 7
m = random (1,N)
Print m
numerot ( m )= numerot( N )
N=N-1
Next

Pauli
Seuraa 
Viestejä148
Liittynyt24.11.2014

En jaksa mitään kieltä, mut täsä on lotto

Array(50) 'kuinka monesta
Count = 7 'kuinka monta

Foi i = 1, count, i++
(
Rnd=rand(1 to 50)
If array(rnd)=0
(
Array(Rnd)=1
Print rnd
)
Else
(
Count--
)
)

Pauli
Seuraa 
Viestejä148
Liittynyt24.11.2014

Pauli kirjoitti:
En jaksa mitään kieltä, mut täsä on lotto

Array(50) 'kuinka monesta
Count = 7 'kuinka monta

Foi i = 1, count, i++
(
Rnd=rand(1 to 50)
If array(rnd)=0
(
Array(Rnd)=1
Print rnd
)
Else
(
i-- 'arvottiin sama numero, joten koitetaan uudestaan
)
)

Merlin
Seuraa 
Viestejä4095
Liittynyt25.9.2017

Listaamalla numerot. Muuta keinoa ei yksinkertaisesti ole, tai kaikki saa rahat takaisin.

Uusimpien tutkimusten mukaan uusimmat tutkimukset ovat keskimäärin yhdentekeviä.

peniemis
Seuraa 
Viestejä134
Liittynyt1.3.2013

jjw kirjoitti:
Arvonta onnistuu ilman, että tarvitsee arpoa uudelleen esiintyneitä numeroita.
Ideana on, että arvotun numeron tilalle vaihdetaan taulukon viimeinen numero ja sitten taulukon kokoa pienennetään yhdellä.

Esimerkiksi nykyinen lotto, 7 numeroa 40:stä.

Alustetaan taulukko numerot (), jossa numerot 1-40
For i = 1 to 40
numerot ( i ) = i
Next

N=40

For i = 1 to 7
m = random (1,N)
Print m
numerot ( m )= numerot( N )
N=N-1
Next

Muutoin hyvä, paitsi p.o.   Print  numerot ( m ) 

Suosituimmat

Uusimmat

Uusimmat

Suosituimmat