Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Generowanie liczby z zakresu, zawsze większa od poprzedniej.


aroB

Rekomendowane odpowiedzi

Opublikowano

Witam kolegów.

Piszę pewien mały skrypt do generowania takich różnych rzeczy i dostałem pustki w głowię.

Potrzebuję wygenerować dużo liczb gdzie każda następna będzie zawsze większa od poprzedniej.

 

Czyli np zakres to 2500,5000 to 

1. 2514

2. 4350

3. 9232

4.11111

 

i tak dalej.

 

W grę nie wchodzi żadne sortowanie liczb bo prostu do tego projektu jest to strasznie niepraktyczne.

 

Zrobiłem kiedyś takie generowanie w innym skrypcie ale mam skompilowany program a kod źródłowy wywaliłem i teraz nie pamiętam jak to zrobiłem.. :)

#EMERYTURA

Opublikowano

Pomysł " poprzednia +1 " nie da próby z rozkładu jednostajnego. Będziesz miał duuuużo wartości bliskich górnej granicy.

Opublikowano

Jak masz przedział <a, b> i chcesz mieć k liczb, możesz podzielić przedział <a,b> na k równych przedziałków i z nich losować liczbę. Ta Ci to równomierny rozkład.

Np dla <1, 1000> i masz 4 liczby do wylosowania to dzielisz to na

<1, 250>

<251,500>

<501, 750>

<751, 1000>

Opublikowano

To juz lepszy pomysl, ale dlaczego proba 200,600,700 mialaby byc zla? Nie otrzymamy takiej twoim sposobem, nie wiem dlaczego autor tak bardzo boi sie sortowania.

Opublikowano

Można też wylosować te k liczb, z przedziału <a,b> a następnie tworzysz sobie drzewo TRIE z tych liczb, w węźle trzymasz liczbę wystąpień tej liczby i BFS odczytujesz po tak stworzonym drzewie liczby już przesortowane.

 

Złożoność obliczeniowa będzie lepsza od zwykłego sortowania. 

Sortowanie zajmie Ci O(n log_2(n))

Przez drzewo TRIE to O(2 * (n * log_10(max_liczba)))

Opublikowano
int main()
{
    int licznik =0;
    srand (time (NULL));
                
    int liczba, liczbaWCZESNIEJSZA=2500;   // Nadanie Liczby wczesniejszej wartosci pierwszego dolnego przedzialu. Przyklad na podanym zakresie 2500 -5000;
    do
    {
        while(true)
        {
        liczba = rand()%2501+2500;
        if (liczba > liczbaWCZESNIEJSZA)
            break;
        }
        liczbaWCZESNIEJSZA = liczba;
        cout << liczba << endl;
        licznik++;
    }
    while(licznik < 10);                // Napisales duzo liczb, nie wiem ile to dla Ciebie duzo - wiec skoryguj ten warunek pod ilość generowań.
                                        // Jezeli chcesz by program miał ruchomy przedzial, skoryguj fukcje rand.




}

Chodziło o coś takiego? 

Opublikowano
int main()
{
    int licznik =0;
    srand (time (NULL));
                
    int liczba, liczbaWCZESNIEJSZA=2500;   // Nadanie Liczby wczesniejszej wartosci pierwszego dolnego przedzialu. Przyklad na podanym zakresie 2500 -5000;
    do
    {
        while(true)
        {
        liczba = rand()%2501+2500;
        if (liczba > liczbaWCZESNIEJSZA)
            break;
        }
        liczbaWCZESNIEJSZA = liczba;
        cout << liczba << endl;
        licznik++;
    }
    while(licznik < 10);                // Napisales duzo liczb, nie wiem ile to dla Ciebie duzo - wiec skoryguj ten warunek pod ilość generowań.
                                        // Jezeli chcesz by program miał ruchomy przedzial, skoryguj fukcje rand.




}

Chodziło o coś takiego? 

 

 

 

int min = 1000;
int max = 2000;

while (min < max)
{
	min += 1 + rand() % 9;
        cout << min << endl;
}

Przecież te programy mają poważną wadę o której wspominał:

 

Pomysł " poprzednia +1 " nie da próby z rozkładu jednostajnego. Będziesz miał duuuużo wartości bliskich górnej granicy.

Opublikowano

Ten temat ciągnie się jak <brak dobrego porównania>. Losujesz sobie twoje n liczb, quicksort -> profit!

 

Napisałeś:

"W grę nie wchodzi żadne sortowanie liczb bo prostu do tego projektu jest to strasznie niepraktyczne."

 

Co masz na myśli? Sugerujesz, że najlepsze rozwiązanie jest słabe?

Opublikowano

 

 

Co masz na myśli? Sugerujesz, że najlepsze rozwiązanie jest słabe?

 

Nie jest słabe, ale może być nieodpowiednie dla niektórych algorytmów w których to pierwszy los jest wiążący i od niego mają zależeć kolejne.

 

 

 

Pomysł " poprzednia +1 " nie da próby z rozkładu jednostajnego. Będziesz miał duuuużo wartości bliskich górnej granicy.

 

 

Jak nie da? Pomysł zaproponowany przez Mańka jest w jakimś stopniu jednostajny (zresztą autor nigdzie nie napisał, że jego liczby mają wzrastać jednostajnie). 

Opublikowano

Ten temat ciągnie się jak <brak dobrego porównania>. Losujesz sobie twoje n liczb, quicksort -> profit!

 

Napisałeś:

"W grę nie wchodzi żadne sortowanie liczb bo prostu do tego projektu jest to strasznie niepraktyczne."

 

Co masz na myśli? Sugerujesz, że najlepsze rozwiązanie jest słabe?

 

Pierwotnie sortowanie liczb wydawało mi się trochę nieporęczne ale po dłuższym namyślę chyba to będzie najlepsza opcja.. zaraz przepiszę program i zobaczę jak to wygląda w praktyce.

 

Pomysł " poprzednia +1 " nie da próby z rozkładu jednostajnego. Będziesz miał duuuużo wartości bliskich górnej granicy.

 

 

Jak nie da? Pomysł zaproponowany przez Mańka jest w jakimś stopniu jednostajny (zresztą autor nigdzie nie napisał, że jego liczby mają wzrastać jednostajnie). 

 

 

Nie  musi wzrastać jednostajnie, każda generowana liczba musi być za każdym razem większa od poprzedniej przynajmniej o minimalną wartość zakresu. - i tyle.

#EMERYTURA

Opublikowano

 

Nie  musi wzrastać jednostajnie, każda generowana liczba musi być za każdym razem większa od poprzedniej przynajmniej o minimalną wartość zakresu. - i tyle.

 

To w czym problem?

Opublikowano

 

 

Nie  musi wzrastać jednostajnie, każda generowana liczba musi być za każdym razem większa od poprzedniej przynajmniej o minimalną wartość zakresu. - i tyle.

 

To w czym problem?

 

 

tzn w niczym, koniec końców użyłem bubble sorta. Tylko program totalnie zawiódł bo potrzebuję wygenerować liczby od 0 do 2,4 miliarda a nie mogę wymyślę wzoru który by odpowiednio generował liczby tak żeby pierwsza była 0 a ostatnia w granicach 2,4 miliarda +

 

Dzięki wszystkim za wkład w temat, jakieś tam lajki rzucę.

#EMERYTURA

Opublikowano

@bluefine Człowieku, daj spokój, nie wszystko trzeba robić obiektowo :D

 

@topic

 

Przykładowo dla zakresu 1-100: (wylosowana zapisuje się w zmiennej liczba)

srand(time(NULL));
int liczba = 0;
while(true)
{
int n = ( rand() % 100) + 1;
if(n > liczba) 
{
liczba = n;
goto d;
}}
d:

Proste jak świński ogon, tylko musisz się liczyć z tym, że gdy za pierwszym razem wylosuje Ci 100, to już następnej nie będzie xD

jw19e8.png

Opublikowano

@MXVOL

Co

Przecież on tutaj używa już gotowej klasy Random, czemu miałby tego nie robić, skoro oferuje ona taką funkcjonalność jaką potrzebuje?

To tak jakbyś ty nie miał używać rand(), użycie metod z klasy Random to chyba najłatwiejszy sposób na wygenerowanie pseudolosowej liczby w c#, tak jak chyba najłatwiejszym jest rand() z cstdlib w c++(choć tutaj można się sprzeczać)

https://msdn.microsoft.com/pl-pl/library/system.random%28v=vs.110%29.aspx

To dzieje się z ludźmi od goto:

goto.png

Bot do gry NosTale:


[bOT] NosBota 1.3v

Opublikowano

Dopóki nie sprawdziłem, nie wiedziałem, że takie coś istnieje. Proszę :)

 

http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution

 

To chyba nie zadziała, napisałem program ustawiłem zakres od 0 do 2500 i.. to generuje te liczby jakby że 2500 to mogą być maksymalnie 4 pierwsze liczby ale jeżeli wygeneruje nam 4 pierwsze liczby np 2005 to potem dopisuje coś z tyłu i wychodzi np coś takiego 2005981948695

Nie wiem jak to wytłumaczyć, chyba że coś źle napisałem.

#EMERYTURA

Opublikowano

Może coś takiego ?

 

 

5cd40c0f49.png

 

 

 

Niby spoko, ale znowu za mały odstęp miedzy liczbami jest.. będę musiał to chyba zrobić bardziej na zasadzie jakiegoś wzoru a nie generowania liczb z zakresu bo nie mogę zrobić tak żeby odpowiednio wygenerował... 

 

Dzięki za wkład chłopaki.

#EMERYTURA

Opublikowano

1. wylosuj liczbę

2. ustaw, że najmniejsza możliwa kolejna liczba do wylosowania to poprzednia liczba+1

3. std::random

To jest złe rozwiązanie z dwóch powodów.

1. Nie gwarantuje, że się zakończy (np. kiedy pierwsza wylosowana liczba będzie maksimum)

2. Jak Pancake wspomniał - nie daje równego rozkładu wyników

 

Jak masz przedział <a, b> i chcesz mieć k liczb, możesz podzielić przedział <a,b> na k równych przedziałków i z nich losować liczbę. Ta Ci to równomierny rozkład.

Np dla <1, 1000> i masz 4 liczby do wylosowania to dzielisz to na

<1, 250>

<251,500>

<501, 750>

<751, 1000>

To nie da równego rozkładu. Da rozkład, który wygląda dla człowieka jako równomierny.

Można by tutaj posłużyć się https://en.wikipedia.org/wiki/Poisson_distribution aby wylosować dla każdego przedziału odpowiednie wagi i w każdym przedziale losować odpowiednio tyle liczb na ile wskazuje waga a później je posortować. Na końcu scalić wszystkie wyniki w jeden posortowany ciąg.

 

Można też wylosować te k liczb, z przedziału <a,b> a następnie tworzysz sobie drzewo TRIE z tych liczb, w węźle trzymasz liczbę wystąpień tej liczby i BFS odczytujesz po tak stworzonym drzewie liczby już przesortowane.

 

Złożoność obliczeniowa będzie lepsza od zwykłego sortowania. 

Sortowanie zajmie Ci O(n log_2(n))

Przez drzewo TRIE to O(2 * (n * log_10(max_liczba)))

Tutaj dlaczego nie jest to dobre rozwiązanie i dlaczego są lepsze

http://stackoverflow.com/questions/14331837/sorting-integers-with-a-binary-trie

Lepiej już zrobić counting sort albo pochodne.

 

int min = 1000;
int max = 2000;

while (min < max)
{
	min += 1 + rand() % 9;
        cout << min << endl;
}

I potrafisz jednoznacznie określić ile liczb wylosujesz?

 

int main()
{
    int licznik =0;
    srand (time (NULL));
                
    int liczba, liczbaWCZESNIEJSZA=2500;   // Nadanie Liczby wczesniejszej wartosci pierwszego dolnego przedzialu. Przyklad na podanym zakresie 2500 -5000;
    do
    {
        while(true)
        {
        liczba = rand()%2501+2500;
        if (liczba > liczbaWCZESNIEJSZA)
            break;
        }
        liczbaWCZESNIEJSZA = liczba;
        cout << liczba << endl;
        licznik++;
    }
    while(licznik < 10);                // Napisales duzo liczb, nie wiem ile to dla Ciebie duzo - wiec skoryguj ten warunek pod ilość generowań.
                                        // Jezeli chcesz by program miał ruchomy przedzial, skoryguj fukcje rand.




}

Chodziło o coś takiego? 

 

Pomijając to o czym było wcześniej mówione. W pesymistycznym przypadku nigdy się nie zakończy. Prawdopodobieństwo tego można szybko oszacować na >0.04, więc dosyć duże

 

 

 

 

Co masz na myśli? Sugerujesz, że najlepsze rozwiązanie jest słabe?

 

Nie jest słabe, ale może być nieodpowiednie dla niektórych algorytmów w których to pierwszy los jest wiążący i od niego mają zależeć kolejne.

 

 

Pomysł " poprzednia +1 " nie da próby z rozkładu jednostajnego. Będziesz miał duuuużo wartości bliskich górnej granicy.

 

 

Jak nie da? Pomysł zaproponowany przez Mańka jest w jakimś stopniu jednostajny (zresztą autor nigdzie nie napisał, że jego liczby mają wzrastać jednostajnie). 

 

Szkoda słów...

 

 

 

Nie  musi wzrastać jednostajnie, każda generowana liczba musi być za każdym razem większa od poprzedniej przynajmniej o minimalną wartość zakresu. - i tyle.

 

To w czym problem?

 

W tym, że jest różnica pomiędzy równomiernym rozkładem liczb losowych a ciągiem arytmetycznym.

 

 

 

 

Nie  musi wzrastać jednostajnie, każda generowana liczba musi być za każdym razem większa od poprzedniej przynajmniej o minimalną wartość zakresu. - i tyle.

 

To w czym problem?

 

 

tzn w niczym, koniec końców użyłem bubble sorta. Tylko program totalnie zawiódł bo potrzebuję wygenerować liczby od 0 do 2,4 miliarda a nie mogę wymyślę wzoru który by odpowiednio generował liczby tak żeby pierwsza była 0 a ostatnia w granicach 2,4 miliarda +

 

Dzięki wszystkim za wkład w temat, jakieś tam lajki rzucę.

 

std::sort (quick sort nie jest trudny nawet do zaimplementowania samemu), czemu wszyscy się tego bubblesorta chwytają...

To jakie będziesz miał liczby zależy od tego jak je będziesz losował. Jak używasz rand() to się nie dziw bo przeważnie RAND_MAX to okolo 32 tysiące

 

Może coś takiego ?

 

 

5cd40c0f49.png

 

 

jw. nie spełnia wymagań. Nie da się określić ile liczb ma zostać wylosowanych i jednocześnie z podanego zakresu.

 

@bluefine Człowieku, daj spokój, nie wszystko trzeba robić obiektowo :D

 

@topic

 

Przykładowo dla zakresu 1-100: (wylosowana zapisuje się w zmiennej liczba)

srand(time(NULL));
int liczba = 0;
while(true)
{
int n = ( rand() % 100) + 1;
if(n > liczba) 
{
liczba = n;
goto d;
}}
d:

Proste jak świński ogon, tylko musisz się liczyć z tym, że gdy za pierwszym razem wylosuje Ci 100, to już następnej nie będzie xD

1. za stosowanie goto w takim przypadku możesz sobie samemu zrobić goto poza to forum

2. "Proste jak świński ogon, tylko musisz się liczyć z tym, że gdy za pierwszym razem wylosuje Ci 100, to już następnej nie będzie xD" Z tym nie można się liczyć, to jest poważna wada, która dyskwalifikuje ten algorytm.

 

 

Dopóki nie sprawdziłem, nie wiedziałem, że takie coś istnieje. Proszę :)

 

http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution

 

To chyba nie zadziała, napisałem program ustawiłem zakres od 0 do 2500 i.. to generuje te liczby jakby że 2500 to mogą być maksymalnie 4 pierwsze liczby ale jeżeli wygeneruje nam 4 pierwsze liczby np 2005 to potem dopisuje coś z tyłu i wychodzi np coś takiego 2005981948695

Nie wiem jak to wytłumaczyć, chyba że coś źle napisałem.

 

Coś źle napisałeś.

 

 

 

Może coś takiego ?

 

 

5cd40c0f49.png

 

 

 

Niby spoko, ale znowu za mały odstęp miedzy liczbami jest.. będę musiał to chyba zrobić bardziej na zasadzie jakiegoś wzoru a nie generowania liczb z zakresu bo nie mogę zrobić tak żeby odpowiednio wygenerował... 

 

Dzięki za wkład chłopaki.

 

Z kody można wyczytać, że odstęp jest losowany z przedziału od 0 do 2500, ale to dalej nie rozwiązuje problemu... Zresztą miałeś już co najmniej 2 razy podane dobre rozwiązanie tylko każdy musi zaciemniać ten wątek...

 

TLDR;

Jakby to forum było normalne to po 2 postach @Pancake (który jako jedyny w tym wątku wykazuje jakiekolwiek pojęcie o tym jak to zrobić) nie byłoby pierdolenia dalej, no ale...

Opublikowano

@Sopelek997

Skoro takie jest życzenie autora tematu, żeby za każdym razem pseudo-losowa liczba była większa, od swego poprzednika w określonym zakresie, to nie jest to żadną wadą mojego algorytmu, tylko, co najwyżej, potrzeby autora.

 

Jeśli tak bardzo goto rwie Ci duszę na kawałeczki, to proszę bardzo, bez niego:

 

srand(time(NULL));
int liczba=0,d=0;
while(d==0)
{
int n = ( rand() % 100) + 1;
if(n > liczba) 
{
liczba = n;
d = 1;
}}

PS. Skoro twierdzisz, że ta niemożność wylosowania liczby powyżej stu jest błędem, to wytłumacz mi, jakbyś inaczej chciał to zrobić:

Jest sobie zakres 1 - 100, losujesz za pierwszym razem byle jaką liczbę z zakresu, a każda kolejna ma być większa od poprzedniej.

To logiczne, że jeśli od razu wylosuje się 100, większej liczby nie będzie, bo taki był zakres, a wedle chęci autora, każdy następca musi być większy od poprzednika. Jeśli nadal się z tym nie zgadzasz, to wątpię, żebyś uważnie przeczytał temat.

 

@MistrzMaster

Jeśli chodzi o rand(), srand(), itp. w przypadku niektórych środowisk (np. Dev-C++) występuje w time.h :v

jw19e8.png

Opublikowano

@MXVOL

Jeśli nadal się z tym nie zgadzasz, to wątpię, żebyś uważnie przeczytał temat.

 

 

Rzeczywiście autor nie umie zwięźle napisać o co mu chodzi... Nie przeczytałem przykładu który dał, a odbiega on od wymagań, które napisał...

 

Nawet sam sobie później zaprzecza, bo w takim wypadku @bluefine dał poprawne rozwiązanie, a autorowi ono nie odpowiada:

 

 

Może coś takiego ?

 

 

5cd40c0f49.png

 

 

 

Niby spoko, ale znowu za mały odstęp miedzy liczbami jest.. będę musiał to chyba zrobić bardziej na zasadzie jakiegoś wzoru a nie generowania liczb z zakresu bo nie mogę zrobić tak żeby odpowiednio wygenerował... 

 

Dzięki za wkład chłopaki.

 

 

Jeśli chodzi o rand(), srand(), itp. w przypadku niektórych środowisk (np. Dev-C++) występuje w time.h :v

 

rand(), srand() są zawsze stdlib.h, time jest w time.h

Opublikowano

@MXVOL

Jeśli nadal się z tym nie zgadzasz, to wątpię, żebyś uważnie przeczytał temat.

 

 

Rzeczywiście autor nie umie zwięźle napisać o co mu chodzi... Nie przeczytałem przykładu który dał, a odbiega on od wymagań, które napisał...

 

Nawet sam sobie później zaprzecza, bo w takim wypadku @bluefine dał poprawne rozwiązanie, a autorowi ono nie odpowiada:

 

 

Może coś takiego ?

 

 

5cd40c0f49.png

 

 

 

Niby spoko, ale znowu za mały odstęp miedzy liczbami jest.. będę musiał to chyba zrobić bardziej na zasadzie jakiegoś wzoru a nie generowania liczb z zakresu bo nie mogę zrobić tak żeby odpowiednio wygenerował... 

 

Dzięki za wkład chłopaki.

 

 

Jeśli chodzi o rand(), srand(), itp. w przypadku niektórych środowisk (np. Dev-C++) występuje w time.h :v

 

rand(), srand() są zawsze stdlib.h, time jest w time.h

 

Gdzie napisałem że mi nie odpowiada? Jego rozwiązanie działa tak jak ma działać tylko że generowane liczby są albo za duże albo za małe. Dlatego napisałem że zamiast generować liczby z zakresu pomyślę nad zrobieniem wzoru który będzie obliczał liczby.. Początkowo myślałem że rozwiązanie pierwsze będzie działać no ale chyba nie będzie.

#EMERYTURA

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...