Jak zrobić wiarygodne losowanie do gry?

0

Serwus. W ramach cwiczeń zrobiełem sobie grę taka tekstową w sensie ze wchodzisz na strone dostajesz punkty i mozesz je wykorzystać na sile zrecznosc czy odporność. w grze jest czat i karczma i w tej karczmie pomyslalem ze zrobie mini gry takie w stylu:

  1. Orzel czy Reszka - czyli gracz wlazi i obstawia dukaty np 1 dukat i zaznacza czy wypadnie orzel czy reszka.
    i
  2. Cos w stylu losowania numerow ze gracz ustala powiedzmy 3 numery z 10 i jak trafi to wygrywa tam dukaty lub traci.

W kazdym razie zastanwiam sie jak do tych gier i w ogole do takich typu gier zrobic wiarygodne losowanie zeby na forum gracze nie mowili np ze pewnie gra tak jest ustawiona zeby przegrali czy cos. Da sie to jakos zabezpieczyc ? tak zeby dac im dane i algorytm losowania i sprawdziliby ze gra nie jest ustawiona.

0

Jak dasz im dane i algorytm to zaczną zawsze wygrywać.

0

Moim zdaniem jeśli chcesz być faktycznie wiarygodny to nie dawaj im żadnego algorytmu tylko po prostu listę n ostatnich wyników z nickami. W ten sposób będą wiedzieli, ile razy były wygrane i przegrane. Co z tego, że pokażesz na forum formułkę jak w rzeczywistości możesz dodać inny modyfikator. Co prawda można to też nagiąć przez fałszywe konta utworzone przez ciebie, ale dla mnie byłoby to bardziej wiarygodne.

0

Wasza dyskusja daje do myślenia i tak: z jednej strony utwierdza mnie, że niestety może nie dać się tego zrobić. Z drugiej strony pomyślałem że przed grą kazdy musi podać jakas liczbe dowolna. jak wszyscy podadza to bedzie jakis tam hash liczony z niej a potem np wybierze sie jakies numery na podstawie tego hasu wedle algorytmu. czyli przyklad:

gracze podaja numer
1,23,44,76,33,23,56,78,98,54
Liczby laczymy w string
z liczb liczymy hash (sh2(string))
albo hash co ma jakies same liczby 6706372326273892
i z tych danych wybieramy po dwie czyli
67,06,37,23, itd
Wyswietlajac wszystkie dane liczby po losowaniu jakie kto dal kazdy powie no faktycznie dalem taka liczbe i podaniu algorytmu moze sprawdzic czy wyszlo to co wyszlo tak ze nikt nie majstrowal przy tym.
Nie wiem na ile to jest dobre ale co myslicie o tym ?

0

A jak udowodnisz że jeden z tych graczy nie jest twoim bot'em który zobaczył liczby przeciwników i na ich podstawie wyliczył swoją liczbę tak aby wygrać ?

0

Czegokolwiek byś nie zrobił, to i tak znajdą się osoby które stwierdzą, że losowanie jest "rigged". Wystarczy poczytać recenzję największych pokerroomów. Przykładowo PokerStars :)

http://www.pokerscout.com/AllReviews.aspx?id=1

Ludzie nie rozumieją i nie chcą zrozumieć prawdopodobieństwa.

1

A nie łatwiej wykorzystać https://api.random.org/json-rpc/1/ ? random.org jest całkiem niezłym generatorem liczb losowych i co ważne takie przeniesienie losowania do zewnętrznej usługi pozwoli ci zachować neutralność wobec kluczowego elementu gry.

0

A co myślicie o tym że na przyklad wylosowana liczba sklada sie z 3 części. I teraz powiedzmy będzie to jedna liczba składająca się z

1. 9878 hash = 9838939jj9j8wj8
2. 7878 hash = ji89j839*H
3. 7670 hash = ij9j3h*H&*

wylosowana liczba to: 987878787670

Liczby te (seed) losuje przed koljnym losowaniem i pokazuje hash tych liczb. Po wylosowaniu pokazuje uzytkownikowi jakie to były liczby i wtedy sprawdzi sobie czy hashe sie zgadzaly. To taki pomysł by byl wiarygodny ?

0

O ile dobrze cie rozumiem cała trudność polega na tym, aby od momentu pokazania hasha do momentu losowania nikt go nie odwrócił tak?
Teoretycznie jeśli pokażesz algo generowania hasza nie ma się do czego przyczepić bo pokażesz hash już wylosowanej liczby której nie zmienisz do czasu jej "odkrycia", ale obawiałbym się osobiście prób jego odwrócenia. A znasz 100% metody zabezpieczenia się przed znalezieniem kolizji? Osoby chcące złamać taki system mogą dysponować np. botnetem, słabości algorytmu na pewno też będą brali pod uwagę, nie mówiąc już o tym że to wymarzona sposobność na stworzenie tęczowych tablic.

Edycja: Zbiór możliwych "liczb" do obstawienia też bardzo zawęża tutaj pole manewru bo jeśli pozwolisz użytkownikom losować np. liczbę 1 z 80 to wystarczy, że przetestuje te 80 możliwości. Wydłużenie tego zbioru spowoduje, że ludzie nie będą w stanie doczekać się wygranej.

0

System genruje jeden seed ciag powiedzmy 100 znakow jest to pierwsza liczba. Druga liczba jest ciag znakow wpisany przez uzytkownika. 3 liczbe system generuje co losowanie. Wszystkie one maja dlugosc 100 znakow. Kazda z tych liczb bylaby powiedzmy zakodowana algorytmem np sha512 czy jakims innym i wiadomoby bylo jakim. Natomiast gra taka mialaby zbyt malo do wygrania zeby sie oplacalo kimus to odkodowywyac. Te liczby bylyby wylosowane przed ich ujawnieniem i uzytkownik wtedy obstawia dana liczbe czy wieksza od wylosowanej czy mniejsza. Po wytypowaniu wyniku pokazujemy mu wylosowana liczbe i te trzy seed'y i user moze sam obliczyc czy sa prawidlowe i ze nie ma oszukiwania. Po losowaniu komputer losuje kolejny seed dla danego uzytkownika i sytuacja sie powtarza. Seed servera zmienia sie co np 12 godzin. To jedyne co udalo mi sie wymyslec.

Losowanie liczby to oczywiscie jakas ich suma , dzielona przez stałą, potem zmieniona np na HEX, wycete litery i zostawinie 4 pierwszych liczb ktore dadza jakis tam wynik. Ten algorytm bylby oczywisty i dostepny

A zabezpieczenie przed odkodowaniem liczby byloby takie ze zniechecamy ludzi do odkodowania ograniczajac im maxymalny zaklad. Tak jak np ruletka grajac algorytmem Monte Carlo, w koncu albo maja limit na obstawianie albo zamykaja stolik jak za duzo wygrywasz.

0

To moja implementacja, oczywiście testowa chodzi tylko o to czy nie będzie zastrzeżeń co do wykonywania algorytmu. Bo będzie on udostępniony dla wszystkich by mogli sprawdzić kod.

 
function genSeed($parLengthPass) 
{
    $key = '';
    $pattern='1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
    for($i = 0; $i < $parLengthPass; $i++)
        $key.=$pattern[rand(0,strlen($pattern)-1)];
    return $key;
}

/* generuje seed 1 jest zmienny co kazde losowanie
    drugi jest zmienny co 1000 gier
    trzeci ustala gracz sam sobie wpsiuje znaki */

$seed1 = genSeed(100);
$seed2 = genSeed(100);
$seed3 = genSeed(100);

// generuje hash ze zlaczonych wszystkich seedow
$res = hash('sha512', $seed1.$seed2.$seed3);

//usuwam z niego znaki ktore nie sa cyframi
$rs3 = preg_replace("/[^0-9,.]/", "", $res);

//wycinam 4 pierwsze liczby
$rs4 = substr($rs3, 0, 4);

//dziele przez 100 zeby miec liczbe zmienna
$rs5 = $rs4 / 100;

String 0345 da mi wynik 3.45
String 9999 da mi wynik 99.99
Nigdy nie osiągne wartosci 100.00 ale moge osiagnac wartość 00.00
co dla mnie jest dozwolone w grze. Zakres liczb ma byc miedzy 0 a 99.99

Algorytm powyżej z seedow wygeneruje hashe ktore będą pokazane przed losowaniem
po pokazaniu wylosowanej cyfry pokaze im seedy przed zakodoaniem
i kazdy moze sam sobie obliczyc czy wynik jest prawidlowy. Pytanie czy jest sie
do czego przyczepic w tym algorytmie ?

0

Hash może składać się z wyłącznie znaków a-f (malo prawdopodobne, ale możliwe) i co wtedy będzie w $rs3 i kolejnych zmiennych?

Co do samego pomysłu ja go trochę źle zrozumiałem. Myślałem, że każdy użytkownik sam sobie wybiera liczbę i ta liczba jest w hashu z seedami czyli:

$res = hash('sha512', $seed1.$seed2.$seed3.$liczba_obstawiona_przez_gracza);

Dokładnie taki sam hasz wypełnia "komputer" z tym, że robi to jako pierwszy i publikuje tylko hash. Gracze widzą nicki gracza, jego wybraną liczbę (opcjonalnie) oraz hash. Po zakończeniu gry wszystkie tajne rzeczy publikujemy tak, aby gracze mogli sprawdzić poprawność zarówno losującego jak i pozostałych graczy.

A ty widzę piszesz algorytm do generowania liczb pseudolosowych. Idealne funkcje haszujące powinny zmieniać równomiernie ok połowy bitów w haszu wynikowym, ale czy tak jest w przypadku SHA nie wiem.

0

Kazdy gracz gra sam dla siebie i widzi swoj seed plus publiczny seed servera i hash seeda wygenrowanego przed gra. Niestety dopiero wtedy gracz wpisuje kwote i ustawia czy liczba wylosowana bedzie nizsza niz dany prog czy wyzsza. I wtedy po wcisnieciu losuj (co wlasciwie powinno byc jako pokaz liczbe) odslania liczbe wylosowana i losuje kolejna do nowej gry i pokazuje hashe seedow. Z analizy jaka przeprowadzilem wystapily wszystkie liczby od 00.00 do 99.99 najbardziej mi zalezy zeby pokazac ten hashe i zeby seed klienta zmienial sie co gre

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