generowanie kolejnych nie powtarzających się liczb całkowitych

0

Witam wszystkich forumowiczów,
Mam za zadanie w C/C++ stworzyć generator zbioru liczb całkowitych. Każda kolejna wygenerowana liczba powinna być większa od poprzedniej (nigdy też nie powinna się dwukrotnie znaleźć w tym zbiorze). Potrzebuje generować duże zbiory.

Nie proszę nikogo, żeby mi ktoś pisał taki generator, ale naprowadził i podpowiedział od czego zacząć, czego warto użyć. Co może okazać mi się przydatne. Może ktoś się z tym zetknął, może natrafił na jakąś literaturę.

Pozdrawiam i proszę o pomoc.

0

rand(), stała MAX_RANBD, dzielenie modulo i dodawanie

0

stała MAX_RANBD? Szczerze, nie bardzo rozumiem o co chodzi. Mógłbyś dodać coś więcej na ten temat? Proszę.

Generowałem już liczbę całkowitą metodą rand() z pewnego interesującego mnie przedziału. Zapisywałem ją do pliku teskstowego tylko i wyłącznie gdy była większa od poprzedniej zapisanej do tego pliku liczby. Czy to dobry tok myślenia?
Chciałbym uniknąć tego żeby druga, czy trzecia wygenerowana liczba była większa od pierwszej o 10000! Stopniowo...

0

int m, x=0;

m=(int)(rand() / (RAND_MAX + 1.0) * 100.0);

if(m>x)
{
>> "to wtedy zapisz do pliku"
w++;
x=m;
}

Cóż niby dostałem to co chciałem, tylko że...
wynikiem jest ciąg:
33, 35, 53, 70, 94, 95, 98, 99.

Każdy poprzedni wyraz zbioru jest większy od następnego. To się zgadza.
Żaden z wyrazów się nie powtarza. To się zgadza.
Ale więcej już ich wygenerować nie mogę. 99 i koniec. Mogę zwiększyć zakres, ale to wyjdzie tyle samo wygenerowanych liczb.

Czy powinienem od nowa generowac liczby z tego zbioru i patrzeć czy takie już wygenerowałem wcześniej? Czy rozwiązać to inaczej. Potrzebuje generować duże zbiory.

0

Najprostszy sposób to moim zdaniem:

 
 #include <limits.h>

 unsigned long long int  a, gornaGranica;
 a = 0;
 gornaGranica =ULLONG_MAX;

 int iloscElementow, skok;
 iloscElementow = 32000;
 skok = 2;


 for( ; iloscElementow; --iloscElementow)
  {
    a = (a + skok) %  gornaGranica;
    //teraz wypisz to albo przekieruj do pliku
  }

0

Załóżmy, że masz do wygenerowania 100 liczb z przedziału od <1,100000> dla każdej generowanej liczby zwiększałbym zakres przykładowo:

  1. liczba x -> losuję od <0, 100> -> przykładowy wynik: 85
  2. x -> < 85, 200 > -> 111
  3. x -> < 111, 300 > -> (...)
    itd.

Oczywiście możesz sobie zagęszczać przedziały czy odwrotnie :) Unikniesz w ten sposób przykładowej sytuacji:
generujemy 100 liczb z przedziału od < 0 - 1000 >

  1. wygenerowana liczba: 54
  2. wygenerowana liczba: 1000
    i dupka bo 2. liczba już jest max wtedy powinieneś generować od początku z wyjątkiem wygenerowanych wcześniej liczb i wygenerowaną liczbę umieszczać w odpowiednim miejscu w ciągu... myślę, że z tym jest więcej "pipcenia".

Takie jest moje zdanie :)

pozdrawiam

0

Oczywiście możesz sobie zagęszczać przedziały czy odwrotnie :) Unikniesz w ten sposób przykładowej sytuacji:
generujemy 100 liczb z przedziału od < 0 - 1000 >
Żeby nie być zmuszonym do powtarzania losowania, to

  • pierwszą liczbę losujemy z przedziału [0,1000-100+1], wylosowana liczba to a1,
  • drugą losujemy z przedziału [a1+1,1000-100+2], wylosowana liczba to a2,
  • trzecią losujemy z przedziału [a2+1,1000-100+3],
    ...
0

Sprawdzam oba sposoby. Zacząłem od pierwszego... autorstwa @bOOsiu:

 
#include <limits.h>

 unsigned long long int  a, gornaGranica;
 a = 0;
 gornaGranica =ULLONG_MAX;

 int iloscElementow, skok;
 iloscElementow = 32000;
 skok = 2;


 for( ; iloscElementow; --iloscElementow)
  {
    a = (a + skok) %  gornaGranica;
    //teraz wypisz to albo przekieruj do pliku
  }

Bardzo spodobało mi się Twoje rozwiązanie, tylko za każdym razem zbiorem wynikowym jest:
2,4,6,8,10,12,14....i tak aż wygenerowania żądanej ilości elementów. Chciałbym bym te skoki były nieduże jednak żeby ten skok nie był stały.

Teraz biorę się za testowanie drugiego przykładu.
Dziękuje wszystkim za pomoc.

0

Prostym sposobem zmodyfikowania tego sposobu jest dopisanie na początku maina tego:

srand(time(0));

a na początku pętli tego:

skok := rand() % (maksymalna wartość skoku jaką byś chciał uzyskać);

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