Wpis z mikrobloga

hejka programistyczne świry
z listy o długości około 790 chciałm wybrać 5 jak najbardziej przypadkowych elementów
wydawało mi się że random.sample(l, k=5) jest dobrym rozwiązaniem tzn każdy pięcioelementowy podzbiór będzie mieć mniej więcej taką samą szansę na bycie wylosowanym
no ale chyba nie za bardzo tak jest bo przy pewnym ustalonym seedzie (2137*69 konkretniej) wyniki dla początkowych fragmentów listy o różnej długości nie różnią się za bardzo od siebie i zmieniają się istotnie dopiero w okolicach potęg dwójki
https://repl.it/repls/AssuredGeneralAtoms
czyli to tak jakby mniej więcej praktycznie nie brało pod uwagę elementów o indeksach powyżej 2\*\*floor(log(1000, 2)) ;///
no i ogólnie chyba nie spełnia w ogóle moich założeń o wybraniu 5 jak najbardziej przypadkowych elementów z danego zbioru ;\\

z drugiej strony przy zabawie w ten sposób:
https://repl.it/repls/UnevenMenacingPolyhedron
wszystko wydaje się w miarę ok, tzn elementy chyba są wybierane z w miaaaaaarę równym prawdopodobieństwem

jak poprawnie zrobić to co chciałm zrobić czyli po prostu ustalić sobie jakiś stały seed tak żeby wyniki były powtarzalne i dla danej listy wybrać jej jak najbardziej przypadkowy podzbiór, ale żeby jednocześnie dodanie albo usunięcie czegoś z końca listy jednak generowało zupełnie inny wynik a nie praktycznie na niego nie wpływało ;//
pierwszym co mi przychodzi do głowy jest dodanie do seeda len(lista) i chyba powinno to w miarę działać tak mi się wydaje
ale dlaczego właściwie sample działa inaczej niż sobie wyobrażałm
o co tu chodzi
czego nie rozumiem

#programowanie #python
  • 68
z listy o długości około 790 chciałm wybrać 5 jak najbardziej przypadkowych elementów


@Chodtok: problem losowości polega na tym, że 1 2 3 4 5 jest tak samo losowe jak 42 458 3 743 349 ;P
kurczę no chodzi mi o to że chciałm jak najbardziej uczciwie wybrać pięć osób spośród plusujących wpis
i w zasadzie to jakieś zewnętrzne liczby chyba nie są tu potrzebne i wystarczyłoby za seed brać długość listy
ale może się mylę i może ogólnie jest jakieś lepsze rozwiąznie

@morsik: @sokytsinolop: @Przegrywek123: @croppz:
no cholera, jak zawsze dajesz tego samego seeda to czego oczekujesz?


no oczekiwałem tego że sample pomimo tego samego seeda dla różnych list generuje różne wyniki tzn że w algorytmie losowania zmienność listy jest jakoś bardziej istotna

@croppz:
w sensie chciałbym tak jak np tak jak tutaj móc napisać przeprowadziłem losowanie w taki i w taki sposób możecie to sobie zweryfikować
no tylko potem odkryłem że to chyba słaby sposób bo przy wybraniu konkretnego seeda lista miała dużo mniejszy wpływ na wynik niż myślałem że ma i duża jej część chyba wgl nie była brana pod uwagę

patrząc na to teraz najlepszym rozwiązaniem wydaje się mi po prostu wzięcie jako
@Chodtok: a jakie? Bo w pythonie nie wiem.

Bo wiesz chodzi o to ze nie manipulujesz jak domniemam. Ale...

Skoro lista wejsciowa jest "dana" czyli na to nie wplywasz to moze ograniczenia shufle sa nieistotne a nie masz na nie wplywu i nie mozesz nimi manipulowac. Wiec ogolnie wszystko ok
a jakie? Bo w pythonie nie wiem.

Note that even for small len(x), the total number of permutations of x can quickly grow larger than the period of most random number generators. This implies that most permutations of a long sequence can never be generated. For example, a sequence of length 2080 is the largest that can fit within the period of the Mersenne Twister random number generator.


jeśli dobrze rozumiem może
hmmm no tak ale jest już ta liczba głosujących i tym ciężko manipulować
tzn jest to pewnie jakoś tam możliwe ale nie wiem co w tym kontekście zmienia znana_wszystkim_losowa_liczba + liczba_głosujących w porównaniu do 0 + liczba_głosujących

@LowcaG:
i chyba obliczanie seeda poprzez hashowanie całej listy głosujących tj ich nicków i wgl wydaje się jeszcze dużo trudniejsze do zmanipulowania niż sama liczba głosujących

@LowcaG:
@Chodtok: jeżeli używasz seeda to random nie jest randomowy i o wszystkim decyduje seed. Na tym polegają seedy, dają powtarzalne rezultaty. Dlatego jeżeli chcesz żeby twoje losowanie było wiarygodne musisz użyć seeda na którego wartość nie miałeś wpływu - dowolna liczba we wpisie (podana zanim ludzie zaczną plusować) + ilość plusów jest spoko, bo nie możesz dowolnie manipulować liczbą plusów.

Timestamp też jest spoko, jeżeli losowanie możesz zrobić tylko raz i
w sensie chodzi mi o to że zamiast

Bo tal latwo o manipulacje czyli np. Podajesz jakas losowa liczbe publicznie plus liczba glosujacych


a konkretniej

liczba glosujacych


lepsze byłoby chyba

hash(lista_głosujących)


@LowcaG:
no ok oboje twierdzicie chyba to samo czyli że

znana wszystkim losowo liczba + liczba głosujących


jest spoko

no więc jeśli się nie mylę to

znana wszystkim losowa liczba + hasz listy głosujących


powinien być jeszcze bardziej spoko i odporny

ciekawi mnie jeszcze jak to się ma do realnego życia i ew profesjonalnych rozwiązań tego typu problemu

i wciąż nie łapię co tutaj zmienia ta znana wszystkim losowa liczba i czemu nie
@Chodtok: znając z góry seeda można łatwo sprawdzić które miejsca na liście dają największe szanse na wygraną - sam to widziałeś w swoim przykładzie.

Jeżeli o kolejności na liście decyduje kolejność plusowania to prędzej czy później jakiś cwaniak się zorientuje że wycofując plusa i plusując ponownie w odpowiednim momencie może sobie zapewnić zwycięstwo. ¯\_(ツ)_/¯
@Chodtok czekaj... biorąc konkretnego seeda, masz niejako konkretny sposób losowania. Czyli de facto konkretny wynik.
Tak, jakbyś zawsze brał czwarty element listy (honestly acquired by throwing a dice #pdk). Będzie to losowanie powtarzalne, weryfikowalne i zależne od listy, z której losujesz. Tyle tylko, że zawsze ten sam element...
W LOSOWANIU raczej chodzi o to, że jest LOSOWE i niepowtarzalne, a powtórzone wielokrotnie zwróci wszystkie elementy z jednakowym prawdopodobieństwem.
znając z góry seeda można łatwo sprawdzić które miejsca na liście dają największe szanse na wygraną


hmm no tak samego seeda nikt nie zna z góry bo zależy on od np liczby plusujących która jest nieznana
a to czy dodamy do tego znane wszystkim przed plusowaniem zero czy znane wszystkim przed plusowaniem niezero chyba niewiele zmienia (?)

i o manipulacje tu chyba ciężko bo nikt nie wie czy inny mniej kombinujący użytkownik
i ja też raczej nie bardzo mogę przy tym kombinować bo ustalając zamknięcie losowania na konkretną godzinę nie mam pojęcia kto zdecyduje się kiedy oddać głos, być może w ostatniej chwili, i jak to wpłynie na wynik

zwłaszcza jeśli biorę hash i wynik zależy od poszczególnych literek w każdym przypadkowym nicku

@croppz:
@Chodtok: no tak jak mówiłem, dowolna liczba - zero też się w sumie sprawdzi. ¯\_(ツ)_/¯

i o manipulacje tu chyba ciężko bo nikt nie wie czy inny mniej kombinujący użytkownik nie doda w ostatniej chwili swojego głosu co zmienia seed i teoretycznie całkowicie wynik


no dokładnie tak jak mówisz. Wbicie się na odpowiednią pozycję na liście miałoby sens tylko przy seedzie ustalonym z góry - wtedy jedyną zmienną w równaniu jest
ale jakiego ostatniego wpisu
ta godzina to chyba dowolna znana liczba jak każda inna
i chyba to np hashowanie plusujących powinno zapewnić wystarczającą losowość (?)

@LowcaG:
@LowcaG: i jak to by miało wyglądać? Liczy hasze aż nie trafi na nick który po dodaniu do listy da seeda gwarantującego mu wynik po czym zakłada multi z takim nickiem i plusuje? Zanim trafi to ktoś inny zaplusuje i całe liczenie trzeba zaczynać od nowa, bez sensu.
Uzytkownik wchodzac na liste przelicza hashe n do przodu i sprawdza czy mu sie oplaca


hmm no ale on chyba nie wie czy zaraz nie zaplusuje tego "xardaswielkiczarodziej" czy "mihaubiauek" co kompletnie zmienia hash i jest chyba nieprzewidywalne
to już kombinowanie przy braniu liczby głosów wydaje się dużo łatwiejsze

@LowcaG: