Skocz do zawartości

Random, losowość, choose


Rekomendowane odpowiedzi

Witam.

 

Czy idzie uzyskać prawdziwą losowść w gm:s ?

Wiem, ze samo choose nie wystarczy, poniewaz przy włączaniu gry od nowa, "losowość" jest taka sama, jak poprzednio. Moze mnie ktoś nakierować na dobrą drogę do uzyskania tego efektu ? Próbowałem napisać kod z duzą ilością obliczeń:

GML
for(i=0;i<10;i++){

rand=ceil(random(500));

}

if rand>=250 then instance_create(x+9,y,oMushroom_red_item)

if rand<=250 then instance_create(x+9,y,oFlower)

 

ale ciągle to samo. Tak samo było w przypadku funkcji "choose" w "choose", co skutkowało tylko odwróceniem się spawnienia obiektów. Wiem, ze był juz taki temat, ale nie ma odpowiedzi (https://forum.gmclan.org/index.php?showtopic=32499&hl=losowo).

(tak, nie działa mi "ż", ten jest skopiowany :P )

Odnośnik do komentarza
Udostępnij na innych stronach

Musisz użyć randomize(), w swoim programie. Ustala on seed twojej pseudolosowości. Można też użyć random_set_seed(x), gdzie x to nasz właśnie seed. Czyli ustawiając zawsze ten sam seed, będziemy mieli zawsze ten sam ciąg liczb losowych. W wypadku randomize(), ustawia się on za każdym razem inny.

Odnośnik do komentarza
Udostępnij na innych stronach

Ja troszeczkę poopowiadam.

 

Komputery są maszynami deterministycznymi: kolejny stan takiej maszyny zależy wyłącznie od poprzednich stanów. Oznacza to, między innymi, że nie istnieje algorytm, który zwróci liczbę prawdziwie losową - liczba, którą wygeneruje, zależy tylko od tego, jakie dane wejściowe ma ten algorytm.

 

Istnieją metody do generowania liczb, które wydają się być losowe. Ponieważ jednak nie są one prawdziwie losowe, nazywa się je pseudo-losowymi. Każda z tych metod korzysta z czegoś, co się nazywa seed (po polsku byłoby pewnie "ziarno", ale "seed" jest krótsze). To, jakie liczby zostaną wygenerowane przez algorytm pseudo-losowy zależy od tego, jaką wartość posiada seed. Dla różnych wartości seed liczby wygenerowane przy wywołaniu funkcji z tymi samymi argumentami mogą być różne.

 

Funkcje: choose(), irandon_range(), irandom(), random_range(), random() działają różnie, ale mają wspólną cechę: wszystkie generują liczby w ten sam sposób, korzystając z wewnętrznego algorytmu pseudolosowego. Oznacza to, że wszystkie funkcje losowe w GM-ie dzielą ten sam seed.

 

GameMaker Studio dla każdego projektu przypisuje pewną domyślną wartość seed, więc przy każdym uruchomieniu aplikacji wywołania funkcji losowych w tej samej kolejności zwrócą te same wartości. GM posiada funkcje do interakcji z seedem:

-randomize() jest tym, czego chcesz - ustawia seed na losową wartość (*)

-random_set_seed() pozwala ręcznie ustawić wartość seed

-random_get_seed() zwraca aktualną wartość seed.

randomize() wystarczy wywołać raz, przy uruchomieniu aplikacji.

 

(*) Ta losowa wartość nie jest losowa - to po prostu czas systemowy, wartość zmieniająca się bardzo często (chyba co milisekundę), więc nie ma mowy o przewidzeniu wartości seed przy uruchomieniu aplikacji, a o to przecież chodzi.

Odnośnik do komentarza
Udostępnij na innych stronach

Popraweczki, bo jestem na bieżąco. :P

GameMaker Studio dla każdego projektu przypisuje pewną domyślną wartość seed, więc przy każdym uruchomieniu aplikacji wywołania funkcji losowych w tej samej kolejności zwrócą te same wartości.
Domyślny seed to 0. Dla każdej gry zrobionej w GM.

 

 

@SimianVirus7 wybierz liczbę całkowitą od 1 do 10. Nie obchodzi mnie co to za liczba, obchodzi mnie czemu ja wybrałeś i czemu nie jest losowa. :) seed możesz sobie wyobrazić (w ogromnym uproszczeniu) jako punkt startowy. Nie ważne jaką liczbę wybrałeś to jeżeli dodasz do niej aktualny czas to wyjdzie Ci 'w miarę' losowa liczba.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...