Ulepszenie Algorytmu

0

Witam,

ma ktoś może jak ulepszyć poniższy algorytm ?
Ja wymyśliłem najprostszą metodę.
Losowana jest liczba z konkretnego przedziału, i umieszczona w tablicy tab, o ile nie wystąpiła wcześniej w tej tablicy.
lista kroków :

0 liczba wylosowana jest wpisywana do tablicy tab
1 wylosowana liczba jest wpisany o ile nie istenieje w tab[0]
2 wylosowana liczba jest wpisany o ile nie istenieje w tab[0] && tab[1]
...
aż zostanie wylosowane n liczb

//funkcja zwraca wskaźnik do tablicy n licz calkowitych wylosowanych z zakresu podanego przez użytkonika.
//Np losowanie dużego lotka : n = 6, zakresdolny = 1, zakresgorny = 49

#include <stdio.h>
#include <stdlib.h>
#include <time.h> // srand()

int* funkcjalosuj(const int n, const int zakresdolny, const int zakresgorny)
{
int *tab;
int i; // iterator petli for
srand(time(NULL)) ; //generuje za ka¿dym razem inna liczbe
int liczbaLosowa;
int zostalawylosowana = 0;
    // tab - tablica wylosowanych elementow
    tab = calloc(n, sizeof(int)); // tworzymy tablice n elementowa typu int
    for(i = 0; i < n; ++i)
    {

       do{
        liczbaLosowa = ((rand() % ((zakresgorny - zakresdolny)+1)) + zakresdolny);
          if( i > 0){
          int ip;
              for(ip = 0; ip < i; ++ip)
                if( liczbaLosowa == tab[ip]) zostalawylosowana = 1;
           }

        }while(zostalawylosowana != 0);
        tab[i] = liczbaLosowa;
     }
    printf("\ntab[%i] = %i", i, tab[i]);
return tab;
}
0

A może napiszesz co ten algorytm w ogóle miał robić?

1

Stwórz tablicę (bool) wielkości tego twojego 'konkretnego' przedziału i zainicjalizuj zerami. Z każdym losowaniem:
tablica[wylosowanaWartosc] = true
Po skończeniu losowań przejdź po tej tablicy i zlicz ilość wystąpień 1(true).
Utwórz tablicę docelową o tej wielkości (ilości wystąpień jedynki) i przekopiuj do niej po kolei numery wszystkich indeksów zawierających wartość 1 (true)

Jeśli chcesz wylosować x liczb bez powtórzeń to stwórz tablicę zawierającą po kolei wszystkie te liczby. 'Potasuj je' (std::shuffle) i wybierz z niej x pierwszych
zależy też ile tych liczb chcesz wylosować i jaki jest zakres, to nie zawsze będzie optymalne rozwiązanie

0

Witam,

właśnie chodziło mi losowanie liczb bez powtórzeń.
Spróbuje Twój pomysł zrealiznować.

Twój sposób z bool nie wiem czemu kojaży mi się z sortowaniem kubełkowym

0

Są 2 wyjścia:

  • losujesz liczby tak jak opisał @Sopelek
  • tworzysz sobie przedział taki jak potrzebujesz w tablicy, a następnie mieszasz wszystkie elementy zamieniając każdy element z innym losowym w tablicy, a potem bierzesz n liczb.

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