Я согласен с AakashM и разочарован. Во-первых, можете ли вы гарантировать, что количество устройств превышает диапазон генерируемых данных? На самом деле, чтобы быть «случайным», вам действительно нужно иметь в два раза сгенерированный контент как устройства, иначе как минимум одному устройству придется «случайным образом выбирать» между одним выбором. Тем не менее, поскольку IMEI - это единственные уникальные данные, основанные на устройстве, вам придется использовать их в своем алгоритме. Другая проблема (я подозреваю) состоит в том, что идентификаторы устройств не обязательно распределяются равномерно, поэтому любое потенциальное сопоставление идентификатора устройства с блоком данных может привести к перекрытию (если у вас нет очень большого диапазона данных для выбора) или Сгенерированные значения не будут равномерно распределены по пулу устройств.
Сказанный здесь грубый алгоритм:
- Создать отображение IMEI в целое число (т. Е. Какой-то хэш)
- Поворот этого целого числа на основе даты и размера возможных значений, сгенерированных на шаге
- Сопоставить результирующее число от 2 с диапазоном значений данных на основе отношения IMEI к диапазону значений, созданному на шаге № 1.
- Используйте стандартное случайное число, чтобы выбрать что-то из этого диапазона
Простой пример использования IMEI в качестве одного байта и диапазона данных 0-> 2559:
- Отображение является прямым на основе IMEI, поэтому base = IMEI
- Перевод даты основан на количестве дней с начала эпохи. Для этого примера скажем 700, затем base = (9 (исходная база: сопоставленный IMEI) +700 (# дней))% 255 (диапазон сопоставленного значения IMEI) = 199
- Диапазон данных в 10 раз превышает диапазон отображаемых значений, поэтому каждый блок может использовать 10 значений, результирующий диапазон данных от 2 становится 1990 -> 1999 (включительно).
- Выберите стандартное случайное значение в диапазоне данных блока (т. Е. 4, как выбрано при броске кубиков) = 1990 + 4 = 1994.
Наконец, если вы хотите, чтобы диапазоны отличались в зависимости от записи, вы можете использовать это в качестве второго смещения, как это было сделано на шаге № 2.