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
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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. ¯\_(ツ)_/¯
  • Odpowiedz
@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.
  • Odpowiedz
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 zdający się na
  • Odpowiedz
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:
  • Odpowiedz
@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
  • Odpowiedz
@Chodtok: (poprawka)zarowno zero jak i dowolna znana liczba jest bez sensu bo uzytkownicy manipuluja, dlatego lepsza by juz byla rzecz niezalezna jak np. Godzina ostatniwgo wpisu zamiast tego zera/liczby
  • Odpowiedz
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:
  • Odpowiedz
@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.
  • Odpowiedz
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:
  • Odpowiedz
hmmm dobra teraz przyszedł mi do głowy jeszcze jeden problem
haszowanie przy pomocy wbudowanych funkcji ma w sobie jakąś tam losowość co utrudnia weryfikowalność i powtarzalność
ale chyba tę losowość powinno dać się jakoś wyłączyć albo po prostu napisać własną deterministyczną funkcję haszującą
i chyba w żaden sposób nie wpływa to na nieprzewidywalność wyników (?)

@croppz: @LowcaG:
  • Odpowiedz
haszowanie przy pomocy wbudowanych funkcji ma w sobie jakąś tam losowość co utrudnia weryfikowalność i powtarzalność

ale chyba tę losowość powinno dać się jakoś wyłączyć albo po prostu napisać własną deterministyczną funkcję haszującą


@Chodtok: wat? Z tego co mi wiadomo to w funkcjach haszujących właśnie o to chodzi że są w pełni deterministyczne. Jakoś sobie nie wyobrażam hashowania haseł jak przy każdej próbie logowania by wychodził inny hasz. ( ͡
  • Odpowiedz
hmmm a nie ma tam jakiejś losowej liczby pierwszej branej przy inicjalizacji interpretera maszyny wirtualnej czy czegokolwiek
bo jak np teraz sobie resetuję pythonową konsolę to za każdym razem wychodzi inny hasz dla tego samego napisu

@croppz:
  • Odpowiedz
Jakoś sobie nie wyobrażam hashowania haseł jak przy każdej próbie logowania by wychodził inny hasz. ( ͡° ͜ʖ ͡°)


no wtedy można chyba ustalić postać tej funkcji haszującej
nie wiem nie znam się

@croppz:
  • Odpowiedz
hmm no miałem tu na myśli pythonowy hash dx
i to chyba faktycznie dawało po prostu id obiektu w cpythonie xddd
no i w sumie moja rozkmina dotyczyła właśnie tych wbudowanych hashów dxd

@croppz:
  • Odpowiedz