• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Prawdopodobieństwo w lotto (C++)

Object Storage Arubacloud
0 głosów
1,427 wizyt
pytanie zadane 5 maja 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam w programie jest kilka błędów jestem tego świadomy, jednak nie mam pomysłu jak mógłbym zrobić to inaczej;

Oto cały kod:

#include <iostream>
//liczenie prawdopodobienstwa w lotto
double pro(double * num, int picks);

int main()
{
	double t[5]; int o; //zmienne typu double i int
	std::cout << "Podaj 5 licz i ostatnia super liczbe:\n";
	for(int i=0; i < 5; i++)
		std::cin >> t[i];
	std::cin >> o; 
	for(int j=0;j<1;j++)
	{
		if((t[j] >= 1 && t[j] <= 47) && (o >= 1 && o <= 27))
			std::cout << "Szansa wygranej to jeden do " << pro(t,o) << ".\n";	//wyliczenie wyniku
		else
			std::cout << "Liczby od 1-5 musza byc mniejsze lub rowna 47, a liczba nr 6 musi byc mniejsza lub rowna 27!\n";
	}
	std::cout << "do widzenia\n";

	return 0;
}

double pro(double * num, int picks) 
{ 
	double total = 1.0;
	for(int i=0;i<1;i++)
		total*=(num[i]+picks/6.0); 
	
	return total; }

Główny problem to:

for(int j=0;j<1;j++)
{ 
       if((t[j] >= 1 && t[j] <= 47) && (o >= 1 && o <= 27)) 
std::cout << "Szansa wygranej to jeden do " << pro(t,o) << ".\n"; //wyliczenie wyniku 
else
std::cout << "Liczby od 1-5 musza byc mniejsze lub rowna 47, a liczba nr 6 musi byc mniejsza lub rowna 27!\n";
 }

Nie wiem jak mogę ominąć tą pętlę, aby warunek obejmował wszystkie elementy tablicy oraz jest błąd z pierwszą częścia warunku, gdy użytkownik wprowadzi liczbę większą od 47 program dalej działa.

Drugi problem to liczenie prawdopodobieństwa (tak widzę błąd i jestem świadomy tego jak program liczy):

 double pro(double * num, int picks)
 { 
double total = 1.0; 
for(int i=0;i<1;i++) 
total*=(num[i]+picks/6.0); 
return total; }

W jaki sposób mogę obliczyć prawidłowo to pradopodobieństwo?

 

1
komentarz 5 maja 2018 przez Hiskiel Pasjonat (22,830 p.)

Ja to może nie doświadczony jestem, ale:

for(int j=0;j<1;j++)
    {
        if((t[j] >= 1 && t[j] <= 47) && (o >= 1 && o <= 27))
            std::cout << "Szansa wygranej to jeden do " << pro(t,o) << ".\n"; //wyliczenie wyniku
        else
            std::cout << "Liczby od 1-5 musza byc mniejsze lub rowna 47, a liczba nr 6 musi byc mniejsza lub rowna 27!\n";
    }

?

??

???

????

?????

??????

komentarz 5 maja 2018 przez Sic Dyskutant (8,510 p.)
Warunek ma się wykonać tylko jeden raz, obejmując wszystkie elementy tablicy.
1
komentarz 5 maja 2018 przez RafalS VIP (122,820 p.)
Obejmuje tylko zerowy element tablicy i ta liczbe o. Nie ma zadnej magii w petli petli for ktora zapewnia ze zawsze obejmie cala tablice. W tej formie petla nie ma sensu.
komentarz 5 maja 2018 przez Sic Dyskutant (8,510 p.)
To w jaki sposób mógłbym rozwiązać ten problem ;p
1
komentarz 5 maja 2018 przez RafalS VIP (122,820 p.)
Zależy co chcesz zrobić. Prawdopodobieństwo w lotku jest takie samo dla każdych liczb. Mozna je wyliczyc ze wzorow matematycznych. Nie znam wersji lotka z jakąś super liczba z innego przedziału, ale dla duzego lotka to jest jeden wzór - kombinacje bez powtórzen i ten program bedzie mial jedną linijkę :D. Ty jednak wczytujesz liczby wiec pewnie chcesz policzyc je numerycznie bez zadnej kombinatoryki, czyli musisz zaimplementować symulacje losowania i losować w cholere razy, najlepiej az kilka razy trafisz, i na koniec podzielić liczbe trafień przez liczbe wszystkich losowań. Jesli symulacja bedzie dzialac odpowiednio dlugo to procentowy wynik powinien sie w pewnym przyblizeniu zgodzic z tym ktory otrzymalibyśmy matematycznie. To wszystko oczywiście jesli Twoj generator liczb losowych bedzie mial rownomierny rozklad.

Jesli nie czaisz idei to napisz najpierw program ktory policzy prawdopodobieństwo trafienia orla w rzucaniu monetą. Rzucasz 1000 razy i liczysz ile razy byl orzel, powinno wyjsc okolo 500 stad po podzieleniu trafień przez liczbe prob masz prawdopodobienstwo okolo 50%.

A tak na marginesie po tm kodzie który wrzuciłeś mysle ze powinieneś napisac najpierw cos prostszego a potem brac sie za lotka.
1
komentarz 5 maja 2018 przez RafalS VIP (122,820 p.)
Te pętle z jednym obiegiem sugeruja ze powinieneś popracowac nad podstawami programowania.
1
komentarz 5 maja 2018 przez RafalS VIP (122,820 p.)
A jesli pytales o sama walidacje czy liczby sa w przedizale to trzeba przeiterowac po tablicy i sprawdzić czy wszystkie liczby sa w dozwolonym przedziale. Nie wiem skad pomysl ze musi byc jeden warunek obejmujący cala tablice.
komentarz 5 maja 2018 przez Sic Dyskutant (8,510 p.)
edycja 5 maja 2018 przez Sic
Dzięki, napisałem ten mały program i do dało mi wiele do myślenia.

Zmieniłem konstrukcje tego programu jednak doszło do mnie jak będzie dopiero wyglądało wyliczenie tego prawdopodobieństwa.
1
komentarz 5 maja 2018 przez szacho Gaduła (3,810 p.)

@Sic, napisz sobie program liczący prawdopodobieństwo, że wśród n osób znajdą się 2 takie, co mają urodziny tego samego dnia - zdziwisz się jak szybko funkcja P(n) przekroczy 99% ;]

1 odpowiedź

+1 głos
odpowiedź 5 maja 2018 przez NIMuser Stary wyjadacz (11,030 p.)
wybrane 8 maja 2018 przez Sic
 
Najlepsza
Do obliczenia prawdopodobieństwa wygranej w lotto (czy innej grze losowej) wystarczy prosty wzór matematyczny (kombinatoryka) i masz wynik w kilkadziesiąt sekund. Program komputerowy do tego nie jest potrzebny, a jak chcesz się pobawić w kombinatorykę na komputerze to polecam raczej pythona. Do pythona są fajne, gotowe biblioteki do tego celu.
komentarz 6 maja 2018 przez Sic Dyskutant (8,510 p.)

znalazłem pewien wzór prawdopodobieństwa chociaż nie wiem czy on się sprawdzi w tym przypadku:

ilość prób/ ilość liczb;

oto część kod wszystko działa jednak pokazuje błąd powinno wyjść ok. 0.12... a pokazuje same zera (sprawdziłem ilość miejsc po przecinku do 30).

total = 6/47;
std::cout.precision(4);      
        std::cout << "\nPrawdopodobienstwo wygranej: " << std::fixed << total << std::endl;

 

2
komentarz 6 maja 2018 przez NIMuser Stary wyjadacz (11,030 p.)

Prawdopodobieństwo trafienia w Lotto

Liczba trafionych numerów Liczba w pełnym zbiorze Szansa wygranej
6* 1 (0,0000072%) 1:13 983 816
5* 258 (0,0018%) ~1:54 201
4* 13 545 (0,097%) ~1:1032
3* 246 820 (1,77%) ~1:57

Podobne pytania

0 głosów
1 odpowiedź 1,680 wizyt
0 głosów
3 odpowiedzi 481 wizyt
pytanie zadane 26 maja 2019 w C i C++ przez ciocialol Nowicjusz (180 p.)
+3 głosów
3 odpowiedzi 658 wizyt
pytanie zadane 7 listopada 2018 w Matematyka, fizyka, logika przez schedz Nowicjusz (220 p.)

92,596 zapytań

141,445 odpowiedzi

319,717 komentarzy

61,980 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...