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

Losowanie bez powtórzeń - liczby pseudolosowe.

Object Storage Arubacloud
0 głosów
462 wizyt
pytanie zadane 12 marca 2017 w C i C++ przez GoRo3 Obywatel (1,640 p.)

Cześć. 

Jako nowy obywatel tego forum, chciał bym się przywitać ze wszystkimi. Za tem! Cześć Wam! 

Od jakiegoś czasu uczę się programować korzystając z kursów na kanale Pasja Informatyki, zresztą stamtąd tutaj trafiłem. Oczywiście jak będę umiał, tak będę się starał również wspierać swoją wiedzą innych członków tego forum. Tym czasem sam mam pytanie:  

Jestem po 5 odcinku czyli znam już tablice i ich zastosowanie. Ponieważ losowanie liczb w lotto z powtórzeniami nie bardzo mi pasowało chciałem zrobić upgrade programu z 4 odcinka tak aby liczby się nie powtarzały. I w zasadzie się udało, oto kod: 

#include <iostream>
#include <unistd.h>
#include <ctime>
#include <cstdlib>

using namespace std;

int liczba[6];
int x[6];

int main()
{
    system("clean");
    srand(time(NULL));
    
    cout<<"Za chwilę zacznie się losowanie liczb"<<endl;
    sleep(3);
    
    for(int i=0; i<6 ;i++)
    {
        x[i]=rand()%49+1;
        
        if((x[i]==liczba[0]) || (x[i]==liczba[1]) || (x[i]==liczba[2]) || (x[i]==liczba[3]) || (x[i]==liczba[4]) || (x[i]==liczba[5]))
        {
            cout <<"\a";
            i--;
        }
        else
        {
            liczba[i]=x[i];
            cout<<"Wylosowana "<<i+1<<" liczba to: "<<liczba[i]<<endl;
            sleep(1);
        }
    }
    getchar();
    
return 0;
}

 

Wykorzystałem do tego celu funkcję IF. Jednak zastanawia mnie jak bardziej ten kod zoptymalizować. Jeżeli w IF'ie wpisujemy  6 spójników logicznych OR to spokojnie można to zrobić z palca, ale gdybyśmy mieli ich np. 1000 ?? Wklepywanie tego samego tysiąc razy nie jest za dobre. Czy istnieje sposób aby jakoś wklepać zakres do zbadania w tablicach coś na stylu np: "IF(x[i]!=tablica[1-999])" ?? Czy za każdym razem trzeba wklepywać nowe spójniki logiczne podobnie jak zrobiłem w kodzie. 

Pozdrawiam

Grzegorz

2 odpowiedzi

0 głosów
odpowiedź 12 marca 2017 przez tangarr Mędrzec (154,780 p.)
wybrane 27 marca 2017 przez GoRo3
 
Najlepsza

Musisz napisać pętlę porównującą wylosowaną wartość ze wszystkimi wcześniej "zatwierdzonymi" liczbami.
 

int n = 6;
int wylosowano = 0;
while (wylosowano < n) {
    int x = rand()%49+1;
    bool powtorzona = false;
    for (int i=0; i<wylosowano; i++) {
        if (x == liczba[i]) {
            powtorzona = true;
            break;
        }
    if (powtorzona)
        continue;
    liczba[wylosowano]=x'
    ++wylosowano;
}

 

0 głosów
odpowiedź 12 marca 2017 przez mokrowski Mędrzec (155,460 p.)
Hmm.. A losowanie Lotto kiedykolwiek widziałeś? :-)

"Do maszyny losującej trafia X liczb, następuje zwolnienie blokady..."

Czyli mówiąc wprost. Wygeneruj w tablicy wszystkie liczby, tablicą "zamieszaj" i je wypisz :-) Najprostsze "mieszanie" (oczywiście bardzo nieefektywne ale to ćwiczenie) to przestawienie liczby na danym polu na wylosowane pole z zakresu wielkości tablicy.

Pokaż swoją 2 próbę bo to jest bardzo nieefektywne i nie warto komentować.

Podobne pytania

0 głosów
2 odpowiedzi 380 wizyt
pytanie zadane 21 marca 2017 w C i C++ przez seba Dyskutant (8,900 p.)
0 głosów
2 odpowiedzi 855 wizyt
pytanie zadane 3 lutego 2017 w C i C++ przez seba Dyskutant (8,900 p.)
0 głosów
2 odpowiedzi 1,176 wizyt
pytanie zadane 5 lipca 2016 w C i C++ przez dokolyski Początkujący (290 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 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!

...