Autor Wątek: Znowu o liczbach pseudolosowych.  (Przeczytany 2123 razy)

Offline s0d

  • Użytkownik

# Maj 22, 2008, 16:07:21
Napisałem program w c# używając .net framework 2.0.
Mam pole i umieszczam na nim kwadraty w "losowych" współrzędnych. Wygląda to następująco (za każdym razem bardzo podobnie):



kod odpowiedzialny za to  jest umieszczony w timerze i wygląda następująco:

private void timer1_Tick(object sender, EventArgs e)
{
            Random rnd = new Random();
            rnd.Next();

            Graphics g;
            g = Graphics.FromImage(bmp);
            Brush br = new SolidBrush(Color.Blue);
            x = rnd.Next(1, 39) * 10;
            y = rnd.Next(1, 39) * 10;
            g.FillRectangle(br, x, y, 10, 10);
            g.Dispose();
            pictureBox1.Invalidate();
}

Co zrobić aby chociaż wyglądało to na losowe współrzędne? Jeżeli wchodzi możliwość robienia własnego randoma to dajcie mi jakieś wskazówki plz.

;)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

maxest

  • Gość
# Maj 22, 2008, 16:21:05
Przekaz w new Random() parametr, najlepiej cos w stylu Environment.GetTickCount czy jak to tam szlo

Offline albireo

  • Użytkownik

# Maj 22, 2008, 16:32:48
Daj zmienną rnd jako składową klasy i inicjuj ją tylko raz (np w konstruktorze).

Offline s0d

  • Użytkownik

# Maj 22, 2008, 16:38:29
@albireo: pomogło i wstyd mi że o tym nie pomyślałem ;). Teraz działa jak powinno.

Offline Anton Chigurh

  • Użytkownik

# Maj 22, 2008, 20:50:00
Przekaz w new Random() parametr, najlepiej cos w stylu Environment.GetTickCount czy jak to tam szlo
To zadziała, i da pod wieloma względami ładne rezultaty. Nie jest jednak rozwiązaniem "najlepszym". Słyszałem od kogoś mądrego, budzącego moje zaufanie, że uzależnianie seeda od czasu nie jest najlepsze z punktu widzenia statystycznego. Sam nie do końca wiem, dlaczego. Do takiej sobie gierki bym sięnie krępował, ale jakbym programował np. jednorękiego bandytę w kasynie to już bym się raczej wystrzegał.

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Maj 22, 2008, 20:53:39
Przekaz w new Random() parametr, najlepiej cos w stylu Environment.GetTickCount czy jak to tam szlo
To zadziała, i da pod wieloma względami ładne rezultaty. Nie jest jednak rozwiązaniem "najlepszym". Słyszałem od kogoś mądrego, budzącego moje zaufanie, że uzależnianie seeda od czasu nie jest najlepsze z punktu widzenia statystycznego. Sam nie do końca wiem, dlaczego. Do takiej sobie gierki bym sięnie krępował, ale jakbym programował np. jednorękiego bandytę w kasynie to już bym się raczej wystrzegał.

Jakbyś programował jednorękiego bandytę w kasynie to byś się w ogóle nie brał za pisanie generatora bo generatorem pewnie byłby układ elektroniczny generujący biały szum albo nie-do-końca-losowy algorytm, który właścielowi maszyny zawsze zapewniałby zysk ;)

maxest

  • Gość
# Maj 22, 2008, 21:13:20
A tak odnosnie szumu... moze dobrym generatorem losowym bylbym szum Perlina z kilkoma warstwami, a potem wybieraloby sie z tego szumu element na podstawie jeszcze innego, wygenerowanego szumu..? I tak kombinowac mozna w nieskonczonosc :P

Offline s0d

  • Użytkownik

# Maj 22, 2008, 21:47:10
Zależy jak często musiałbyś generować losową liczbę ;) bo każda ms jest na wagę złota ;D. Ale pomysł ciekawy.

maxest

  • Gość
# Maj 22, 2008, 22:21:09
No przeciez nie mowie o generowaniu tego caly czas! Raczej starczyloby to raz wylicz, a potem jeszcze "losowo" skakac po tym szumie, a indeksy skokow okreslalby inny szum :P
W zasadzie "losowanie" polegaloby na pobraniu nastepnego indeksu z tablicy :)