[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Drelson
Użytkownik
Użytkownik
Posty: 79
Rejestracja: 7 paź 2014, o 18:01
Płeć: Mężczyzna
Lokalizacja: warszawa
Podziękował: 16 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: Drelson »

Mam pytanie jak mam napisać w języku C++ losowanie dwóch dowolnych liczb z ustalonego zbioru załóżmy \(\displaystyle{ \left\langle 1;6\right\rangle}\) za pomocą funkcji rand ale tak żeby te dwie liczby nie były równe?
Ostatnio zmieniony 22 lis 2014, o 15:59 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Kacperdev
Użytkownik
Użytkownik
Posty: 3260
Rejestracja: 23 mar 2010, o 19:19
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 17 razy
Pomógł: 686 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: Kacperdev »

Kod: Zaznacz cały

1+ rand()% 6
w ogólności:

Kod: Zaznacz cały

a+ rand()% (b-a+1)
i teraz wykonujesz to dwa razy, przy czym, po drugim losowaniu sprawdzasz czy wylosowana liczba nie jest równa pierwszej. I losujesz dopóki jest taka sama.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: Dasio11 »

W pechowym przypadku tych losowań może wyjść sporo, więc pokażę sposób o czasie oczekiwania, który można ograniczyć z góry. ;-)

Kod: Zaznacz cały

int t[6] = { 1, 2, 3, 4, 5, 6 };

int i = rand()%6;
int A = t[i];
t[i] = 6;

int B = t[rand()%5];
athame
Użytkownik
Użytkownik
Posty: 576
Rejestracja: 2 lut 2012, o 21:42
Płeć: Mężczyzna
Lokalizacja: Radom
Podziękował: 1 raz
Pomógł: 64 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: athame »

Kod powyżej jest niepoprawny. Możliwość wylosowania dwóch 6 (sprawdziłem empirycznie, choć już na pierwszy rzut oka widać ten błąd).

Przywrócono treść posta. Niedozwolone jest modyfikowanie treści wypowiedzi, jeśli do tej treści istnieją odniesienia w dalszych postach. Dasio11
Ostatnio zmieniony 22 lis 2014, o 21:55 przez athame, łącznie zmieniany 1 raz.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: Dasio11 »

A mógłbyś pokazać, w jakim przypadku losują się dwie szóstki? Bo ja na drugi, ani nawet na trzeci rzut oka, tego nie widzę. :(
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: Afish »

Wylosuj dwa razy z kolei indeks 0 chociażby.
athame
Użytkownik
Użytkownik
Posty: 576
Rejestracja: 2 lut 2012, o 21:42
Płeć: Mężczyzna
Lokalizacja: Radom
Podziękował: 1 raz
Pomógł: 64 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: athame »

Dasio11 pisze:A mógłbyś pokazać, w jakim przypadku losują się dwie szóstki? Bo ja na drugi, ani nawet na trzeci rzut oka, tego nie widzę.
Napisz program. Zapętlij wszystko tak, żeby wykonało się ze 100 razy i wyświetlaj warunkowo liczby, tylko wtedy , kiedy A=B. U mnie wyświetliło ze 20 razy taki zestaw i zawsze to były dwie "szóstki". Kod jest krótki i prosty, więc z pewnością odkryjesz dlaczego.

Przywrócono treść posta. Niedozwolone jest modyfikowanie treści wypowiedzi, jeśli do tej treści istnieją odniesienia w dalszych postach.
Ostatnio zmieniony 22 lis 2014, o 21:55 przez athame, łącznie zmieniany 1 raz.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: Dasio11 »

Zapętliłem tak, żeby wykonało się 1000000 razy:

Kod: Zaznacz cały

#include <iostream>
#include <cstdlib>
#include <ctime>

int main()
{
    srand( time( NULL ) );

    for( int n = 0; n < 1000000; ++n )
    {
        int t[6] = { 1, 2, 3, 4, 5, 6 };

        int i = rand()%6;
        int A = t[i];
        t[i] = 6;

        int B = t[rand()%5];

        if( A == B )
        {
            std::cout << "i = " << i << "
";
            std::cout << "A = " << A << "
";
            std::cout << "B = " << B << "
";
            std::cout << "
";
        }
    }

    return 0;
}

i nie wypisało mi nic.
[Edit] Wątpliwość może brać się stąd, że jedna z liczb, która wygląda jak 6, tak naprawdę chytrze jest liczbą 5. :P [/Edit]

Jak wylosuję dwa razy indeks 0, to:

Kod: Zaznacz cały

i = 0;
A = t[0] = 1;
t[0] = 6;
B = t[0] = 6;
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: Afish »

Dasio11 pisze:Jak wylosuję dwa razy indeks 0, to:

Kod: Zaznacz cały

i = 0;
A = t[0] = 1;
t[0] = 6;
B = t[0] = 6;
A racja, wycofuję się z tych głupot :)
bartek118
Użytkownik
Użytkownik
Posty: 5974
Rejestracja: 28 lut 2010, o 19:45
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 15 razy
Pomógł: 1251 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: bartek118 »

Kod Dasia jest bardzo fajny i sprytny; co najfajniejsze nie zmienia wcale losowości (jeżeli można w komputerze w ogóle o losowości mówić)!
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Losowanie dwóch dowolnych liczb z ustalonego zbioru

Post autor: Dasio11 »

Mhm. A przedłużenie tej procedury prowadzi do uzyskania kodu, który losuje permutację zbioru { 1, 2, ..., n }.
ODPOWIEDZ