Losowanie bez powtórzeń

0

Potrzebuję pomocy przy losowaniu bez powtórzeń. Napisałem sobie takie coś ale niestety nie dział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);
                }
            }

Pomoże mi ktoś i powie co tu jest źle?

0

było dziesiątki razy. użyj wyszukiwarki albo google

0

Po co w pętli wywołujesz srand? Powinieneś sprawdzać tablice czy już nie było takiej liczby jeżeli była to po prostu powtórzyć losowanie (do skutku)

0

Coś tam było ale postanowiłem napisać swoje losowanie i chciałbym wiedzieć co jest z nim nie tak że nie działa. :/

0

Absolutnie wszystko masz źle, przy każdej iteracji tworzysz całą tablicę i jej stan początkowy od nowa, od nowa inicjalizujesz generator pseudolosowy, stosujesz jakieś bzdurne ify...

0

Z litości, najprostsze efektywne rozwiązanie:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define ILE 69

int main() {
  int i = 0;
  int *losy = malloc(ILE * sizeof(int));

  srand(time(NULL));

  for (i = 0; i < ILE; ++i) {
    losy[i] = i;
  }

  for (i = ILE; i > 0; --i) {
    int wylosowany = rand() % i;

    printf("%d ", losy[wylosowany]);

    losy[wylosowany] = losy[i - 1];
  }
  free(losy);

  return 0;
}
0

ŁF:
Dzięki zaraz obejrze te linki i zobacze co uda mi się wykombinować.

PS:
Twój kod niestety nie działa. Na linijce int *losy = malloc(ILE * sizeof(int)); pokazuje się błąd: "error: invalid conversion from 'void*' to 'int*' "

0

To sobie dodaj odpowiednie rzutowanie, zasugerowałem się Twoim kodem, który z C++ nie ma wiele wspólnego, napisałem w ANSI C i mi umknęło...

0

Sprobuj:

 
int* losy = (int*)malloc(ILE * sizeof(int));
0

Dodatkowo poczytaj o tym jak działa generator pseudolosowy, a w szczególności srand(). Liczby pseudolosowe nie biorą się z księżyca, tylko wynikają z podanego seeda. Jeśli np. w dwóch uruchomieniach programu będziesz seedował generator tą samą liczbą to rand() w obu przypadkach da identyczne liczby w identycznej kolejności. Resetujesz generator co iterację pętli, a seedujesz go czasem z dokładnością do sekund - stąd cały czas będziesz otrzymywał te same wyniki, bo bezsensownie przywracasz stan co iterację.

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