Моя цель:
Я хотел бы иметь функцию, которая берет адрес электронной почты и выводит квазислучайное число 1, 2, 3 или 4.
Маленькая деталь:
Под квазислучайным числом я подразумеваю, что при типичной совокупности адресов электронной почты вероятности получения значения 1, 2, 3 или 4 примерно равны, и что очевидные систематические свойства адреса электронной почты, такие как доменное имя, делают не влияет на вероятность получения значения 1, 2, 3 или 4.
Немного предыстории:
У меня есть онлайн-эксперимент, написанный на инквизиции, где участники входят в систему два раза. Я хочу случайным образом распределить участников в одну из четырех групп. Хотя это легко сделать за один сеанс (я могу просто использовать генератор случайных чисел), мне нужен некоторый способ запомнить распределение между сеансами. Таким образом, я подумал, что могу извлечь квазислучайное распределение группы из электронного письма участника. Я также ограничен в наборе функций, которые есть в моем распоряжении ( полный список см. Здесь ). Строковые функции: tolower toupper, с заглавными буквами, concat search, замена содержит все начинается с конца, с подстроки, аккуратной, аккуратной, длиной, форматом, трилфартом, форматом оценки.
Начальные мысли:
Я думал о попытке извлечь набор функций из адреса электронной почты, который возвращает значение 1, 2, 3 или 4 с примерно равными вероятностями. Затем я мог бы суммировать эти свойства и получить мод 4 плюс 1 этого. Таким образом, предполагая что-то вроде центральной предельной теоремы, я мог бы приблизиться.
Возможные особенности, которые пришли мне в голову:
- длина строки
- положение первых «а», «б» и т. д.
источник
Ответы:
Посмотрите хеш-функции, например, на http://en.wikipedia.org/wiki/Hash_function
источник
Почему бы просто не иметь справочную таблицу чисел для каждого возможного символа в электронном письме. Затем объедините числа, чтобы сформировать семя. Например,
Таким образом, abc @ ccc, будет преобразован в 12327333. Это даст вам уникальное семя для каждого человека. Затем вы будете использовать это для генерации 1, 2, 3, 4.
Судя по твоему вопросу, похоже, ты не против "быстрого и грязного решения". Одна из проблем моего решения заключается в том, что адреса электронной почты не случайны - например, вы, вероятно, получите очень мало адресов электронной почты, которые содержат букву «z», но все адреса электронной почты содержат «@».
источник
В дополнение к другим отличным ответам я просто приведу простой пример на языке R, чтобы показать очень простую хеш-функцию, которая должна быть достаточно хороша для этой цели. Чтобы получить некоторые адреса электронной почты в качестве тестовых данных, я получаю символьный вектор с электронными письмами сопровождающих (слишком много!) Пакетов R, установленных на моем компьютере:
Затем я определяю простую функцию, которая получает некоторое число от каждого символа в адресе электронной почты, добавляет их, вычисляет остаток по модулю 4 и добавляет 1, так что он всегда возвращает один из результатов 1,2,3 или 4:
Тогда применяя это:
и мы можем наблюдать, что полученное распределение близко к однородному.
источник
Вы можете попытаться преобразовать каждый символ в число ascii, умножить их все вместе, чтобы вызвать переполнение, а затем выполнить операцию модуля для наименее значащих цифр. Если это недостаточно псевдослучайно, вы можете немного сдвинуть числа ...
Ральф Винтерс
источник