Losowanie bez powtórzeń, lotto.

Kiedy losujemy liczbę i liczba może się powtórzyć wtedy taka inicjacja jest prosta do przedstawienia:

Dim LiczbaLosowana As new Random
Dim ZmiennaLosowa As Integer 
ZmiennaLosowa = LiczbaLosowana .Next(1,100)

Taki zapis pozwoli nam pod zmienną „ZmiennaLosowa” podstawić losową liczbę z przedziału od 1 do 100. Niestety po pewnym czasie korzystania z tego zapisu zauważycie, że jeśli potrzebowaliśmy losowania kilku liczb z jakiegoś małego przedziału, jest duże prawdopodobieństwo, że nasze liczby się powtórzą. Zrobimy dzisiaj program który pokaże wam jak wylosować 6 liczb z 49 czyli tak jak w lotku. Może się to komuś przyda do opracowywania strategi gry w tę grę. Zaczynamy od nowego projektu i rozkładamy 7x textbox, 1x button, 1x listbox, 6x label, tak jak na obrazku:

losowanie_bez_powt

Program nasz będzie losował 6 liczb z 49. Sami będziemy mogli określić jak duża puli liczb ma być i ile tych liczb ma być typowane. Aby liczby nie powtarzały się stworzymy sobie tablice typu „boolean” i wypełnimy ją sobie od 0 do 49 i wypełnimy ją sobie „false”. Co to nam daje. Otóż gdy padnie liczba na określonym numerze tablicy np:3 a jego wartość będzie wynosiła „true” wtedy nie będzie ona dodawana do puli wylosowanych liczb i program będzie liczył dotąd aż wylosuje niepowtarzające się liczby.

Jeśli przyjmiemy, że nasza losowana liczba to będzie „i” nasza tablica będzie wyglądała następująco

tablica(1)=false

tablica(2)=false

tablica(3)=false

(…)

tablica(49)=false

Teraz podczas inicjowania naszego programu losujemy liczbę z przedziału od 1-49 i wylosowaliśmy liczbę „2”. Cyfrę tą wrzucamy do puli liczb wylosowanych a nasza tablica przyjmuje wartości:

tablica(1)=false

tablica(2)=true

tablica(3)=false

(…)

tablica(49)=false

Teraz gdy nasze „i” przyjmie ponownie wartość „2”. Cyfra ta nie zostanie ponownie przyjęta do puli ponieważ w tablicy będzie oznaczona jako „true” i zostanie pominięta.

Program robiony był prze zemnie w Sharpie. Najpierw inicjujemy komponenty:

Public Partial Class MainForm
	Dim max As Integer =49 'okresla ilosc cyfr w losowaniu
	Dim randomNum As new Random
	Dim LiczbaKontrolna As Integer 
	Dim losowania As Integer = 6 ' okresla ilosc losowanych liczb

	(...)

Teraz tworzymy uchwyt dla naszego przycisku. Program trafione liczby będzie zaznaczał poprzez zmianę koloru textboxa na czerwono dla tego najpierw wyczyścimy sobie kolor naszych textboxów kodem:

Sub Button2Click(sender As Object, e As EventArgs)
	'dodatkowo	
	textBox2.BackColor = Nothing
	textBox3.BackColor = Nothing
	textBox4.BackColor = Nothing
	textBox5.BackColor = Nothing
	textBox6.BackColor = Nothing
	textBox7.BackColor = Nothing

(...)

Teraz zainicjujemy sobie tablice. Jedną do przechowywania trafionych liczb drugą do przechowywania naszych liczb i trzecią typu „boolean” kontrolną przechowującą „true” i „false”

(...)
Dim wylosowaneLiczby As New List(Of Integer)
Dim mojeLiczby As new List(Of Integer)
Dim wylosowane As new List(Of Boolean)
(...)

Teraz wypełniamy sobie naszą tablicę „wylosowane” zmienną „false” od 0 do „max” i zerujemy nasz textbox który wyświetlać nam będzie wylosowane liczby (podczas ponownego losowania aby liczby z poprzedniego losowania nie były dodawane.) i zerujemy listbox który będzie pokazywał nam które liczby dostały wartość „true”

(...)
For i As Integer = 0 To max
		wylosowane.Add(False)
Next
		'czyści listboxa
listBox1.Items.Clear()
		'zeruje losowanie
textBox1.Text = ""
(...)

Teraz przechodzimy do głównej pętli która będzie losowała nasze liczby, wygląda on tak:

(...)
'rozpoczyna losowanie
Dim start As Integer = 0
Do While start <= losowania-1
	LiczbaKontrolna = randomNum.Next(1,max)
		If wylosowane(LiczbaKontrolna)=False Then
			wylosowane(LiczbaKontrolna)=true
			textBox1.Text += LiczbaKontrolna.tostring + ","
			'dodatkowo
			wylosowaneLiczby.Add(LiczbaKontrolna)
			start+=1
	End If
Loop
(...)

Warto sobie tą pętle przeanalizować. Teraz musimy dodać tylko:

'pętla wypełni listbox trafieniami
		For Each element In wylosowane
			listBox1.Items.Add(element)
		Next
		'pętla koloruje trafione liczby na czerwono
		For each elements In wylosowaneLiczby
			If textBox2.Text = elements.ToString Then
				textBox2.BackColor=Color.Red
			Else If textBox3.Text = elements.ToString Then
				textBox3.BackColor=Color.Red
			Else If textBox4.Text = elements.ToString Then
				textBox4.BackColor=Color.Red
			Else If textBox5.Text = elements.ToString Then
				textBox5.BackColor=Color.Red
			Else If textBox6.Text = elements.ToString Then
				textBox6.BackColor=Color.Red
			Else If textBox7.Text = elements.ToString Then
				textBox7.BackColor=Color.Red
		End If
		next

Jeśli wszystko zrobiliście dobrze powinno to wyglądać jak na filmie:

pełen kod można pobrać tutaj: loser_lotto

Permalink do tego artykułu: https://visualmonsters.cba.pl/losowanie-bez-powtorzen-lotto/

Dodaj komentarz

Twój adres email nie będzie publikowany.