Wątek przeniesiony 2016-10-06 19:24 z C/C++ przez Patryk27.

Co powinienem dodać by liczby losowane się nie powtarzały?

0

Witam czy wie ktoś może co powinienem dodać do tego programu by liczby losowane się nie powtarzały ?
Jeżeli to możliwe to proszę o najprostszy sposób ,ponieważ jestem początkującym.

#include <iostream>
#include <windows.h>
#include <time.h>
#include<cstdlib>

using namespace std;

int main()
{
    int a[8],wybor;
    srand(time(0));
    {
        for (int i=0;i<4;i++)
        {

            a[i]=rand()%8+1;
            wybor=a[i];
            cout<<a[i]<<endl;

switch(wybor)
{
    case 1: cout <<"Ciag Fibonacziego"<<endl;

    break;

    case 2: cout<<"Silnia"<<endl;
    break;

    case 3: cout<<"dopis,zapis wizytowki"<<endl;
    break;

    case 4: cout <<"srednia ocen"<<endl;

    break;

    case 5: cout<<"szukanie pozycji w zdaniu "<<endl;

    break;

    case 6: cout <<"wyjmowanie kawalka zdania ze zdania"<<endl;

    break;

    case 7:cout <<"Min i Max w zbiorze liczb"<<endl;

    break;

    case 8:cout<<"zgadnij jaka liczba,strzal"<<endl;

    break;
}
        }
}
}
4

Najłatwiejsza metoda (ale mało skuteczna dla dużych zakresów): potasuj kontener zawierający unikalne liczby, wybierz n pierwszych elementów:

	vector<int> randomized(20);
	iota(randomized.begin(), randomized.end(), 0); // 0..19

	mt19937_64 gen{random_device{}()};
	shuffle(randomized.begin(), randomized.end(), gen); // tasuj

	randomized.resize(6); // wybierz 6 losowych bez powtorzen

http://melpon.org/wandbox/permlink/xAmO7JNTpgYYCT2i

3

Ale inna metoda. Zamiast korzystać z tablicy w stylu C zrób

std::set<int> wybor

i pętlę w stylu "dopóki w wybor są mniej niż 4 elementy, dodaj(insert) nowy losowy element".

    while(wybor.size() < 4) {
        wybor.insert(rand()%8+1);
    }

Set ma tę własność że jak próbujesz dodać element którzy już znajduje się w zbiorze, to on go nie doda. Doczytaj na http://www.cplusplus.com/reference/set/set/
Kodu nie testowałem, ale powinien działać, o ile nie ma literówek :)
Btw. nie zapomnij o #include <set>

0

Jeśli chcesz najprościej to powinieneś dodać tablicę (wylosowanych liczb) oraz warunek sprawdzający czy wylosowana liczba padła już we wcześniejszych losowaniach (porównanie wylosowanej liczby do wszystkich miejsc w tablicy).

Jeśli nie: zapisz wylosowaną wartość do tablicy
Jeśli tak: nie zapisuj (pomiń) i losuj jeszcze raz

Tutaj ( http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Losowanie-bez-powtorzen/293 ) masz całkiem dobrze wytłumaczone, jeśli przeczytasz wszystko ze zrozumieniem to poradzisz sobie.

..no chyba, że szukasz gotowca na zaliczenie - w tym wypadku albo przeszukaj internet albo zobacz lub spytaj o cenniki zamówień na programy u naszych klepaczy ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1