dokładne losowanie liczb pseudolosowych

2011-02-16 20:09
someguy
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.

Pozostało 580 znaków

2011-02-16 20:21
1

srand wywołuje się TYLKO raz!


Pozostało 580 znaków

2011-02-16 20:26
j_s_r_n
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()

Pozostało 580 znaków

2011-02-16 20:26
someguy
0

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

To nie jest wytłumaczenie ... ;) Raczej złe nawyki - Blood 2011-02-16 20:27

Pozostało 580 znaków

2011-02-16 20:48
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 ;)


Pozostało 580 znaków

2011-02-16 20:56
someguy
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.

Pozostało 580 znaków

2011-02-16 21:49
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;
}

Pozostało 580 znaków

2011-02-17 16:15
someguy
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ę?

Pozostało 580 znaków

2011-02-17 16:19
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.


edytowany 1x, ostatnio: byku_guzio, 2011-02-17 16:20

Pozostało 580 znaków

2011-02-17 17:39
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-02-17 18:58
0

http://forum.p-zone.pl/image-vp96993.html#96993

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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