С адреса электронной почты до квази-случайного числа [закрыто]

10

Моя цель:

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

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

Под квазислучайным числом я подразумеваю, что при типичной совокупности адресов электронной почты вероятности получения значения 1, 2, 3 или 4 примерно равны, и что очевидные систематические свойства адреса электронной почты, такие как доменное имя, делают не влияет на вероятность получения значения 1, 2, 3 или 4.

Немного предыстории:

У меня есть онлайн-эксперимент, написанный на инквизиции, где участники входят в систему два раза. Я хочу случайным образом распределить участников в одну из четырех групп. Хотя это легко сделать за один сеанс (я могу просто использовать генератор случайных чисел), мне нужен некоторый способ запомнить распределение между сеансами. Таким образом, я подумал, что могу извлечь квазислучайное распределение группы из электронного письма участника. Я также ограничен в наборе функций, которые есть в моем распоряжении ( полный список см. Здесь ). Строковые функции: tolower toupper, с заглавными буквами, concat search, замена содержит все начинается с конца, с подстроки, аккуратной, аккуратной, длиной, форматом, трилфартом, форматом оценки.

Начальные мысли:

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

Возможные особенности, которые пришли мне в голову:

  • длина строки
  • положение первых «а», «б» и т. д.
Джером англим
источник
1
Очень интересная проблема. У вас есть образец "типичной совокупности адресов электронной почты"? Кроме того, не гарантируется, что адреса электронной почты посетителей имеют одну и ту же другую / другую структуру, но так как вы ищете только приблизительное значение ... Второй вопрос: вы в состоянии установить начальное значение ГСЧ?
Штеффен
6
Звучит так, будто вам нужна «хэш-функция»: en.wikipedia.org/wiki/Hash_function Хотя это относится к области компьютерных наук, а не к статистике, поэтому я не уверен, что она относится к CrossValidated.
OneStop
1
hmpf;) ... Я собирался написать то же самое. @Jeromy: Особенно эта часть сайта ( en.wikipedia.org/wiki/… ) может быть интересной для вас.
Штеффен
@onestop Спасибо за совет о хэштегах. Что касается вопроса о теме для сайта, я думаю, что случайное распределение участников по группам по своей природе связано с дизайном исследования, что, в свою очередь, связано с выводами из данных.
Джером Энглим
1
@ Джереми Хеш-функция - это совсем не то же самое, что хэштег! Я вижу вашу точку зрения о дизайне обучения, хотя. Я признаю, что не прочитал весь ваш вопрос должным образом.
OneStop

Ответы:

3

Почему бы просто не иметь справочную таблицу чисел для каждого возможного символа в электронном письме. Затем объедините числа, чтобы сформировать семя. Например,

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

Таким образом, abc @ ccc, будет преобразован в 12327333. Это даст вам уникальное семя для каждого человека. Затем вы будете использовать это для генерации 1, 2, 3, 4.


Судя по твоему вопросу, похоже, ты не против "быстрого и грязного решения". Одна из проблем моего решения заключается в том, что адреса электронной почты не случайны - например, вы, вероятно, получите очень мало адресов электронной почты, которые содержат букву «z», но все адреса электронной почты содержат «@».

csgillespie
источник
Небольшое замечание о вышеупомянутом методе заключается в том, что в адресах электронной почты есть куча допустимых символов, в частности знаков препинания, которые вы хотели бы рассмотреть, если бы делали это.
Дсолимано
@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. Добавление чисел вместо этого уже было бы намного лучше. Если вам нужна еще лучшая случайность, используйте какую-то хеш-функцию и используйте любые биты результата. Если вы хотите, чтобы было трудно угадать что-либо о результате для людей, кроме вас, используйте соленую сильную криптографическую хеш-функцию.
Эрик П.
Согласовано. Просто хотел предложить идею проиллюстрировать сдвиг битов, чтобы генерировать (примерно) псевдослучайные числа.
Ральф Уинтерс