dokładne losowanie liczb pseudolosowych

0

potrzebuję podpowiedzi na losowanie liczb, ale bardziej dokładnego aniżeli

    srand(static_cast<int>(time(NULL)));
    return rand()%(Max - Min)+ Min; 

ponieważ wyniki takiego losowania są słabe, losując z zakresu 1, 100 po 10 losowaniach miałem liczby: 39, 45, 53, 62, 65... po prostu wynik się zwiększał po trochu, a inna sprawa, że chciałbym żeby w ciągu sekundy było w stanie wylosować więcej niż jedną liczbę na przykład podczas losowania w pętli

for(i=0; i<10000; i++)
{
srand(static_cast<int>(time(NULL)))
std::cout<<rand()%100+1;
} 

przez pierwszą sekundę cała konsola będzie zawalona jedna liczbą która dopiero po chwili się zmieni.
czekam na jakieś sugestie, dzięki.

1

srand wywołuje się TYLKO raz!

0

srand() używa się 1(słownie : jeden) raz na całe wykonanie programu.
w mainie zapisz to jako pierwszą linijkę, a potem używaj już wyłącznie rand()

0

wiem... to jest tylko przykład pisałem to na szybko podczas pisania postu żeby zobrazować sytuację.

0

Skoro to jest tylko "przykład żeby zobrazować sytuację" to czemu piszesz o problemie z losowaniem więcej niż jednej liczby w ciągu sekundy? Przecież ten problem jest właśnie spowodowany tym, że za każdym razem wywołujesz srand...
Coś się mylisz w zeznaniach ;)

0

:O, no to się faktycznie zbłaźniłem chyba faktycznie u siebie też tak testowałem. no to drugi problem zażegnany, pozostaje pierwszy.

0

Pierwszy problem jest związany z tym samym - inicjujesz generator podobnymi wartościami. Wywołuj go tylko raz, a problem zniknie, zobacz różnicę między:

int main()
{
    int j = static_cast<int>(time(NULL));
    srand(j);
    for(int i=0; i<10; i++)
    {
        std::cout<<rand()%100+1 << std::endl;
    }
return 0;
}

a:

int main()
{
    int j = static_cast<int>(time(NULL));
    for(int i=0; i<10; i++)
    {
        srand(j + i);
        std::cout<<rand()%100+1 << std::endl;
    }
return 0;
}
0

niee, tu nie chodzi o to mój kod wygląda tak:

#include <iostream>
#include <ctime>
#include <cstdlib>
int main()
{
    int j = static_cast<int>(time(NULL));
    srand(j);
    int a = rand()%100+1;
    std::cout<<a;
return 0;
}

 

odpalam program... i wynik to 8, ok świetnie zamykam program odpalam go jeszcze raz i wynik to 15 następnie 23 i 31.
coś jeszcze źle robię?

0

Problem pojawia się tylko jeżeli odpalasz program w krótkich odstępach czasu. Ponieważ wartość którą inicjujesz generator liczb pseudolosowych niewiele się będzie różnić, bo inicjujesz go aktualnym czasem.
Zawsze możesz napisać swój generator, jeżeli masz na tyle umiejętności z matematyki, albo inicjować czymś innym, a nie czasem.

0

Ja tu problemu nie widzę. Odpal program 100 razy, w odstępach co najmniej sekundowych i zrób sobie histogram, myślę że nie powinno być wielkich nieprawidłowości.

0

link xitami mi wiele wyjaśnił. nie mam więcej pytań.

0

Xitami:
Sugerujesz, że rand() produkuje dokładnie (powtarzającą się) permutację elementów od 0 do RAND_MAX (czy cokolwiek co jest limitem)? Ja jestem sceptyczny co do tego. Poza tym to, że funkcja zwraca wartości max 32-bitowe nie oznacza, że okres tej funkcji wynosi max 2^32. Okres może być dowolnie długi, zależy generalnie od algorytmu i rozmiaru wewnętrznego stanu tej funkcji losującej.

0

W ogólności masz rację.
Ale w szczególności (chodzi o mi o prostotę "wbudowanego" "generatora") racji nie masz.
Ale chyba to wiesz.
Każdy programowy generator ma skończoną konstelację stanów, odpowiedzialnie można go używać tylko wtedy gdy się o tym wie.
A teraz z innej beczki...
rand()%ILEŚ
czy rozkład będzie jednostajny? To znaczy czy każda z wartości 0..ILEŚ-1 jest tak samo prawdopodobna?
Czemu nie jest?

0

Tak, będzie miał określoną ilość stanów, ale to przez ograniczone typy liczbowe. rand()%ILEŚ nie będzie jednostajny (Rand). Najlepiej było by użyć np. mt19937 lub innego bardziej losowego od LCG, który nie jest zbyt "szumny".

0

Xitami:
Każda wartość z uniwersum powinna być jednakowo prawdopodobna. Podobnie każdy ciąg. Czyli ciąg 1, 2, 3, 4, 5 powinien być tak samo prawdopodobny jak 5, 5, 5, 5, 5. Gdyby np rand() zwracał dokładnie permutację i np RAND_MAX wynosił 5, to po wylosowaniu 4, 1, 0, 2 wiedzielibyśmy jaka będzie następna wylosowana liczba (czyli 3), a tak nie powinno być. Wynik prawdziwej funkcji losowej nie zależy od poprzednich wyników.

Taka jest moja intuicja, nie podparta jakąś szczególną wiedzą na ten temat, zwłaszcza na temat implementacji funkcji rand(), o której wiem tylko tyle, że jest słaba.

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