Mój cel:
Chciałbym mieć funkcję, która pobiera adres e-mail i wyświetla quasi-losową liczbę 1, 2, 3 lub 4.
Mały szczegół:
Przez quasi-losową liczbę rozumiem, że biorąc pod uwagę typową populację adresów e-mail, prawdopodobieństwo uzyskania wartości 1, 2, 3 lub 4 jest w przybliżeniu równe, a oczywiste systematyczne właściwości adresu e-mail, takie jak nazwa domeny, nie wpływa na prawdopodobieństwo uzyskania wartości 1, 2, 3 lub 4.
Trochę tła:
Mam internetowy eksperyment napisany w zapytaniu, w którym uczestnicy logują się dwa razy. Chcę losowo przypisać uczestników do jednej z czterech grup. Chociaż jest to łatwe do zrobienia dla jednej sesji (mogę po prostu użyć generatora liczb losowych), potrzebuję jakiegoś sposobu zapamiętania alokacji między sesjami. Pomyślałem więc, że mogę wyodrębnić quasi-losowy przydział grupy z e-maila uczestnika. Mam również ograniczony zestaw funkcji, które mam do dyspozycji ( pełna lista znajduje się tutaj ). Funkcje ciągów to: tolower toupper wielkie litery konkat szukaj zamień zawiera początki z końcami z podciągiem przycięcie prawy trym format długości ocena
Wstępne myśli:
Myślałem o próbie wyodrębnienia zestawu funkcji adresu e-mail, które zwróciły wartość 1, 2, 3 lub 4 z mniej więcej równymi prawdopodobieństwami. Następnie mógłbym zsumować te właściwości i uzyskać mod 4 plus 1 tego. Zakładając coś w rodzaju centralnego twierdzenia o granicy, mogę się zbliżyć.
Możliwe funkcje, które przyszły mi do głowy:
- długość sznurka
- pozycja pierwszego „a”, „b” itp.
źródło
Odpowiedzi:
Wyszukaj funkcje skrótu, na przykład na stronie http://en.wikipedia.org/wiki/Hash_function
źródło
Dlaczego nie mieć po prostu tabeli liczb dla każdej możliwej postaci w wiadomości e-mail. Następnie połącz liczby, aby utworzyć ziarno. Na przykład,
Więc abc @ ccc, zostanie przekonwertowany na 12327333. To da unikalne ziarno dla każdej osoby. Następnie użyłbyś tego do wygenerowania 1, 2, 3, 4.
Z twojego pytania wynika, że nie masz nic przeciwko „szybkiemu i brudnemu rozwiązaniu”. Jednym z problemów z moim rozwiązaniem jest to, że adresy e-mail nie są losowe - na przykład prawdopodobnie otrzymasz bardzo niewiele adresów e-mail zawierających literę „z”, ale wszystkie adresy e-mail zawierają „@”.
źródło
Jako dodatek do innych doskonałych odpowiedzi, podam prosty przykład w języku R, aby pokazać bardzo prostą funkcję skrótu, która powinna być wystarczająca do tego celu. Aby uzyskać adresy e-mail jako dane testowe, otrzymuję wektor znaków z e-mailami opiekunów (zbyt wielu!) Pakietów R zainstalowanych na moim komputerze:
Następnie definiuję prostą funkcję, która pobiera pewną liczbę z każdego znaku w adresie e-mail, dodaje je, oblicza resztę modulo 4 i dodaje 1, więc zawsze zwraca jeden z wyników 1,2,3 lub 4:
Następnie zastosuj:
i możemy zaobserwować, że wynikowy rozkład jest zbliżony do jednorodności.
źródło
Możesz spróbować przekonwertować każdy znak na liczbę ascii, pomnożenie ich wszystkich razem, aby wymusić przepełnienie, a następnie wykonanie operacji modułu na najmniej znaczących cyfrach. Jeśli nie jest to wystarczająco pseudolosowe, możesz nieco przesunąć cyfry ...
-Ralph Winters
źródło