Skocz do zawartości

Losowane bez powtórzeń WinApi


Arekadiusz

Rekomendowane odpowiedzi

Potrzebuję programu który będzie losował mi liczby bez powtórzeń z pobranego ze zmiennej przedziału liczb (np. 1-20). Losowanie mam ale nie wiem jak zrobić aby liczby się nie powtarzały i aby przedział był brany ze zmiennej. Z kolei ta zmienna ma być odczytywana z pliku ini. Szukałem w Google ale jakoś nie mogę nic znaleźć.

Mam takie coś:

srand( (unsigned)time( NULL ) );
char los[2];
los[0] = (rand()%10)+48;
los[1] = NULL;
MessageBox (NULL, los, "Losowanie", MB_OK);

Będę wdzięczny za pomoc! :unsure:

Odnośnik do komentarza
Udostępnij na innych stronach

Udało mi się stworzyć coś takiego ale niestety niedziała. Liczby się powtarzają.

            int i;
            for(i=0; i<=10; i++)
            {
                int ile=10;
                int losy[10];
                int wszystkie[10];
                losy[0]=1;
                losy[1]=1;
                losy[2]=1;
                losy[3]=1;
                losy[4]=1;
                losy[5]=1;
                losy[6]=1;
                losy[7]=1;
                losy[8]=1;
                losy[9]=1;
                losy[10]=1;
                srand( (unsigned)time( NULL ) );
                char los[2];
                los[0] = (rand()%ile)+48;
                los[1] = NULL;
                int losik=0;
                losik = (int) strtod(los, NULL);
                if (losy[losik]==0)
                {
                    MessageBox (NULL, "Wylosowana liczba już była!", "Losowanie", MB_OK);
                }
                else
                {
                    wszystkie-1;
                    if (wszystkie==0)
                    {
                        MessageBox (NULL, "Koniec!", "Koniec", MB_OK);
                    }
                    losy[losik]=0;
                    MessageBox (NULL, los, "Losowanie", MB_OK);
                }
            }

Wiem o tym że tablicę "losy" mogę wypełnić od razu ale po prostu na razie zrobiłem tak żeby było czytelniej jak dla mnie.

Odnośnik do komentarza
Udostępnij na innych stronach

int ile=10;
int wylosowane[10];
srand(static_cast<int>(time(NULL)));
for(int i=0;i<10;++i) wylosowane[i]=-1;
for(int i=0; i<10; ++i)
{
  bool jr=false;
  int wylos=-1;
  while(true)
  {
    wylos=(rand()%ile)+48;
    for(int j=0;j<10;++j)
    {
      if(wylos==wylosowane[j]) jr=true;
    }
    if(jr==false) break;
  }
  wylosowane[i]=wylos;
}

 

Pisane na szybko, nie sprawdzałem.

Odnośnik do komentarza
Udostępnij na innych stronach

Bo jeśli ma, np. wylosować 10 nie powtarzających się liczb całkowitych z zakresu 1-5 to się zawiesi, bo to nie możliwe.

No tak ale nawet jeżeli wprowadzę jakąś liczbę np. 150 (int ile=150;) do kodu prosto skopiowanego z twojego posta to program zawiesza się gdzieś na 7 liczbie. Więc jak wielki mam podać przedział aby się nie zaciął!?

Odnośnik do komentarza
Udostępnij na innych stronach

Poszukałem w Google i jest taka funkcja tylko że nie bardzo wiem jak jej użyć i co ona ma mi dać.

Znalazłem takie coś:

void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand )

Sorki że tak pytam o wszystko ale z C++ jestem początkujący. Mam nadzieję że pomożecie.

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra dzięki już sobie poradziłem :)

Tylko przy okazji mam jeszcze pytanko czy w WinApi mając kilka pól (EDIT) i przycisków (BUTTON) można podczas działania programu ustawić które pole ma być obecnie aktywne (w którym teraz należy pisać)? Szukałem w Google ale nie znalazłem takiej funkcji.

Odnośnik do komentarza
Udostępnij na innych stronach

Spróbuj poszukać. Słowa kluczowe: focus, winapi

O! Dzięki teraz jest pięknie!

To jeszcze ostatnia sprawa... :/

Piszę sobie w polu tekstowym i chciałbym aby po wciśnięciu jakiegoś klawisza działa się dana akcja. Niestety obsługa klawiszy przy pomocy case WM_KEYDOWN nie działa pewnie dlatego że to pole tekstowe no ale ja chcem wykorzystać klawisz ENTER który nie jest używany bo to małe pole (EDIT) i nie przechodzi się tam do kolejnej linii. Chyba że można też w jakiś sposób użyć do tego tej funkcji SetFocus ale nie bardzo wiem jak :(

Odnośnik do komentarza
Udostępnij na innych stronach

Przepraszam że znów odświeżę ale pisząc sobie dziś spokojnie mały programik napotkałem się na problem i nie za bardzo wiem jak go rozwiązać. Potrzebuję porównać dwie zminne typu char. Mam w dużym skrócie takie coś:

int ktora=5;  //dla testu
char* zmienna[10];  //...odczyt danych z pliku ini do zmiennej [i]zmienna[/i] prz użyciu pętli for
GetPrivateProfileString(TEXT("Plik"), TEXT("5"), TEXT("blad"), zmienna[5], 80, TEXT(Nazwa));
//to tak w dużym skrócie :)
DWORD dlugosc = GetWindowTextLength( hPole );
char *odpowiedz =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
GetWindowText( hPole, odpowiedz, dlugosc + 1 );
if (zmienna[ktora]==odpowiedz)
{
MessageBox( hwnd, "Dobrze", "Komunikat!", MB_ICONINFORMATION );
}

Gdy w pliku ini jest to samo co ja wpiszę w pole, komunikat i tak się nie pokazuje :(

Z tego co czytałem char można że sobą porównać używając == ale nie jestem pewien, dlatego chciałbym sie Was zapytać jak powinno być. Dzięki za pomoc!

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...