Від електронної адреси до квазі-випадкового номера [закрито]


10

Моя мета:

Я хотів би мати функцію, яка приймає адресу електронної пошти та видає квазі випадкове число 1, 2, 3 або 4.

Маленька деталь:

Під квазі-випадковим числом я маю на увазі те, що з урахуванням типової сукупності адрес електронної пошти ймовірність отримання значення 1, 2, 3 або 4 приблизно однакова, і це очевидні систематичні властивості адреси електронної пошти, такі як ім'я домену не впливають на ймовірність отримання значення 1, 2, 3 або 4.

Невеликий фон:

У мене є онлайн експеримент , написаний на inquisit де лог учасників в два рази. Я хочу випадковим чином віднести учасників до однієї з чотирьох груп. Хоча це легко зробити за один сеанс (я можу просто використовувати генератор випадкових чисел), мені потрібен певний спосіб запам'ятати розподіл по сесіях. Таким чином, я подумав, що можу отримати квазі-випадкове групове виділення з електронної пошти учасника. Я також обмежений набором функцій, які маю в своєму розпорядженні ( див. Тут повний список ). Функціями рядка є: нижчий зворотник з великим рахунком великого розміру пошуку замінника, який містить старт, з кінцями, з підрядкою, обрізка, обрізний формат, триметрі, тримфлефт, оцінка формату довжини

Початкові думки:

Я думав про спробу витягти набір функцій адреси електронної пошти, який повертав значення 1, 2, 3 або 4 з приблизно однаковими ймовірностями. Тоді я міг би підсумувати ці властивості та отримати мод 4 плюс 1 цього. Таким чином, припускаючи щось на зразок центральної граничної теореми, я можу наблизитися.

Можливі функції, які мені спадали на думку:

  • довжина струни
  • положення перших «а», «б» тощо.

1
Дуже цікава проблема. Чи є у вас зразок "типової сукупності адрес електронної пошти"? Крім того, не гарантується, що адреси електронної пошти відвідувачів мають таку ж іншу / іншу структуру, але оскільки ви шукаєте лише наближення .... Друге питання: Чи можете ви встановити насіння RNG?
steffen

6
Схоже, ви хочете "хеш-функцію": en.wikipedia.org/wiki/Hash_function Це в царині інформатики, а не статистики, тому я не впевнений, що він належить до CrossValidated.
onestop

1
hmpf;) ... Я мав намір написати те саме. @Jeromy: Особливо ця частина сайту ( en.wikipedia.org/wiki/… ) може бути цікавою для вас.
steffen

@onestop Дякую за пораду про хештеги. Що стосується того, чи є питання на тему для сайту, я вважаю, що випадкове розподіл учасників до груп споконвічно пов'язане з дизайном дослідження, що в свою чергу пов'язане з висновками з даних.
Джеромі Англім

1
@Jeremy Хеш-функція - це не те саме, що хештег! Я бачу ваш погляд на дизайн дизайну. Я визнаю, що не читав належним чином все ваше запитання.
onestop

Відповіді:



3

Чому б не просто мати таблицю пошуку номерів для кожного можливого символу в електронному листі. Потім з'єднайте числа, щоб утворити насіння. Наприклад,

A 1
B 2
C 3
....
@ 27
....

Тож abc @ ccc буде перетворено на 12327333. Це дасть вам унікальне насіння для кожної людини. Потім ви використовуєте це для створення 1, 2, 3, 4.


З вашого питання, схоже, ви не проти "швидкого та брудного рішення". Одна з проблем мого рішення полягає в тому, що адреси електронної пошти не є випадковими - наприклад, ви, мабуть, отримаєте дуже мало адрес електронної пошти, що містять букву "z", але всі адреси електронної пошти містять "@".


Невелика примітка щодо вищевказаного методу полягає в тому, що в електронних адресах є купа дійсних символів - зокрема розділові знаки - які ви хотіли б врахувати, якби це робили.
dsolimano

@dsol: Я згоден. Ви можете легко потрапити в поле електронної адреси зі знаком "+". Для швидкого та брудного рішення я, мабуть, просто пропустив би будь-які знаки пунктуації, які я не вказав у таблиці пошуку.
csgillespie

1

Як додаток до інших відмінних відповідей, я просто наведу простий приклад мовою R, щоб показати дуже просту хеш-функцію, яка повинна бути достатньо хорошою для цієї мети. Щоб отримати деякі адреси електронної пошти в якості тестових даних, я отримую символ символів з електронними листами обслуговуючого персоналу (занадто багато!) R пакетів, встановлених на моєму комп’ютері:

library(stringr) # on CRAN 
last <- function(x) { return( x[length(x)] ) }

INST  <-  installed.packages(priority="NA", fields=c("Maintainer"))
Maintainer <- INST[, "Maintainer"]
Mlist <- str_split(Maintainer, "[[:blank:]]")
Maddr <- sapply(Mlist, FUN=last)
Maddr <- str_replace(Maddr, "[<>]", "")
Maddr <- unique(Maddr)

Тоді я визначаю просту функцію, яка отримує певну кількість від кожного символу на адресу електронної пошти, додає їх, обчислює залишок модуля 4 та додає 1, тож він завжди повертає один з результатів 1,2,3 або 4:

apply_to_each_char  <-  function(w, FUN) {
    ww <-  str_split(w, "")[[1]]
    res <- sapply(ww, FUN)
    } # END apply_to_each_char
charsum <- function(word) { # length-one char vector
    sum0 <- sum( apply_to_each_char(word, function(w) as.integer(charToRaw(w)) ))
    return( 1 + sum0 %% 4)
    } # end charsum

Потім застосуйте його:

hashes <- sapply(Maddr, charsum)
table(hashes)
hashes
  1   2   3   4 
542 511 562 552 

і ми можемо спостерігати, що отриманий розподіл близький до рівномірного.


0

Ви можете спробувати перетворити кожен символ на число ascii, помноживши їх усі разом, щоб примусити переповнення, а потім виконати операцію з модулем на найменш значущих цифрах. Якщо це недостатньо псевдовипадково, ви можете трохи змінити числа ...

-Ральф Зимовий


2
Думаю, множення - це не найкраща ідея. Особливо, якщо ваш початковий перелив є звичайним - по модулю деяка потужність 2. Ви отримаєте безліч коефіцієнтів, які є рівними, тому більшість ваших нижчих бітів буде 0. Додавання чисел разом замість цього було б вже набагато краще. Якщо вам потрібна ще краща випадковість, використовуйте якусь хеш-функцію та використовуйте будь-які біти результату. Якщо ви хочете, щоб було важко здогадатися про результат для інших, крім вас, використовуйте солену сильну криптографічну хеш-функцію.
Ерік П.

Домовились. Просто хотів запропонувати ідею проілюструвати зсув бітів, щоб генерувати (приблизно) псевдовипадкові числа.
Ральф Вінтерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.