Генерация разных случайностей действительна в течение дня на разных независимых устройствах? - PullRequest
0 голосов
/ 26 мая 2010

Позвольте мне описать систему. Существует несколько мобильных устройств, каждое из которых не зависит друг от друга, и они генерируют контент для одного и того же идентификатора записи.
Я хочу избегать генерации одного и того же контента для одной и той же записи на разных устройствах, хотя для этого я бы использовал случайный выбор и сделал бы слишком кластеризацию пула контента на основе этих случайностей.

Предположим, у вас есть выбор от 1 до 100.

День 1

  • Устройство # 1 выберет для записи # 33 от 1 до 10
  • Устройство № 2 выберет для записи № 33 значение 40-50
  • Устройство № 3 выберет для записи № 33 от 50 до 60
  • Устройство № 1 выберет для записи № 55 значение 40-50
  • Устройство № 2 выберет для записи № 55 значение от 1 до 10
  • Устройство № 3 выберет для записи № 55 значение 10-20

  • Устройство # 1 выберет для записи # 11 значение от 1 до 10

  • Устройство № 2 выберет для записи № 22 от 1 до 10
  • Устройство № 3 выберет для записи № 99 от 1 до 10

День 2

  • Устройство № 1 выберет для записи № 33 от 90 до 100
  • Устройство № 2 выберет для записи № 33 от 1 до 10
  • Устройство № 3 выберет для записи № 33 между 50-60

У них нет доступа к центральному серверу.
Данные доступны для каждого из них:

  • IMEI (уникальный для каждого мобильного телефона)
  • Дата сегодня (одинаково на всех устройствах)
  • Идентификатор записи (одинаково на всех устройствах)

Как вы думаете, как это возможно?

пс. теги можно редактировать

Ответы [ 2 ]

3 голосов
/ 26 мая 2010

Я согласен с AakashM и разочарован. Во-первых, можете ли вы гарантировать, что количество устройств превышает диапазон генерируемых данных? На самом деле, чтобы быть «случайным», вам действительно нужно иметь в два раза сгенерированный контент как устройства, иначе как минимум одному устройству придется «случайным образом выбирать» между одним выбором. Тем не менее, поскольку IMEI - это единственные уникальные данные, основанные на устройстве, вам придется использовать их в своем алгоритме. Другая проблема (я подозреваю) состоит в том, что идентификаторы устройств не обязательно распределяются равномерно, поэтому любое потенциальное сопоставление идентификатора устройства с блоком данных может привести к перекрытию (если у вас нет очень большого диапазона данных для выбора) или Сгенерированные значения не будут равномерно распределены по пулу устройств.

Сказанный здесь грубый алгоритм:

  1. Создать отображение IMEI в целое число (т. Е. Какой-то хэш)
  2. Поворот этого целого числа на основе даты и размера возможных значений, сгенерированных на шаге
  3. Сопоставить результирующее число от 2 с диапазоном значений данных на основе отношения IMEI к диапазону значений, созданному на шаге № 1.
  4. Используйте стандартное случайное число, чтобы выбрать что-то из этого диапазона

Простой пример использования IMEI в качестве одного байта и диапазона данных 0-> 2559:

  1. Отображение является прямым на основе IMEI, поэтому base = IMEI
  2. Перевод даты основан на количестве дней с начала эпохи. Для этого примера скажем 700, затем base = (9 (исходная база: сопоставленный IMEI) +700 (# дней))% 255 (диапазон сопоставленного значения IMEI) = 199
  3. Диапазон данных в 10 раз превышает диапазон отображаемых значений, поэтому каждый блок может использовать 10 значений, результирующий диапазон данных от 2 становится 1990 -> 1999 (включительно).
  4. Выберите стандартное случайное значение в диапазоне данных блока (т. Е. 4, как выбрано при броске кубиков) = 1990 + 4 = 1994.

Наконец, если вы хотите, чтобы диапазоны отличались в зависимости от записи, вы можете использовать это в качестве второго смещения, как это было сделано на шаге № 2.

1 голос
/ 26 мая 2010

Если каждое устройство имеет уникальный DeviceID (возможно, на основе серийного номера оборудования или чего-то еще), вы можете использовать его вместо этих схем случайных чисел. Будет намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...