Что такое хороший алгоритм для отображения случайных (значения штрих-кода) чисел в строку в коллекции? - PullRequest
3 голосов
/ 12 апреля 2011

Скажите, что у моего приложения есть конечное количество "вещей", в моем случае они будут элементами в моей игре, но для целей этого вопроса я буду использовать строки.

Скажем, у меня есть 5 строк:

  1. Джеймс
  2. Дэйв
  3. Джон
  4. Стив
  5. Джек

Там будетбыть набором из них, однако я увеличу этот список в будущем.

Вопрос : Какой хороший алгоритм я могу использовать, чтобы перейти от случайного числа (генерируемого изштрих-код) в одно из этих значений сверху?

Например, если у меня есть значение 4523542354254, то какой алгоритм я могу использовать, чтобы отобразить его на Dave?Если у меня снова будет тот же номер, мне нужно убедиться, что он соответствует Dave, а не чему-то другому каждый раз.

Один из вариантов, который я действительно рассмотрел, - это взять последнюю цифру штрих-кода и использовать 0-9, который будет отображаться на 10 предметах, но это не очень надежно для будущего, если я добавлю 11-й предмет.

Есть предложения?

Ответы [ 2 ]

5 голосов
/ 12 апреля 2011

Хмм ... Если все в порядке, что несколько значений могут быть сопоставлены с одним, вы можете использовать

string name = names[value % number_of_names];
4 голосов
/ 12 апреля 2011

С пояснением: «Если у меня снова будет тот же номер, мне нужно убедиться, что он отображается на Дейва, а не на что-то другое каждый раз».применяется только до тех пор, пока набор строк не изменяется.

Самое простое, что говорит Маверик, name = names[barcode % names.length];

Java long достаточно большой, чтобы хранить любой штрих-код UPC, int нет, поэтому я предполагаю, что barcode - это long.Обратите внимание, что последняя цифра штрих-кода UPC - это base-11, это может быть X.Я оставляю читателю в качестве упражнения, как вы на самом деле отображаете штрих-коды в числа.Один из вариантов - просто отбросить контрольную цифру, как только вы установили, что она правильная - она ​​вычисляется из других, поэтому она не добавляет никакой информации и не делает различий между любыми другими равными кодами.

Но, как Стивен С.говорит, что штрих-коды не случайны, так что это может не дать вам равномерное распределение по именам.

Чтобы получить лучшее распределение, вы могли бы сначала хешировать штрих-код.Например, name = names[String.valueOf(barcode).hashCode() % names.length];

Это все еще может быть не совсем равномерным - есть лучшие, но обычно более медленные хеш-функции, чем String.hashCode - но это, вероятно, позволяет избежать каких-либо серьезных ошибок, которые могут быть в реальных штрих-кодах.

Кроме того, я не могу вспомнить, возвращает ли оператор модуля Java отрицательные результаты для отрицательного ввода - если это так, то вам нужно привести его в положительный диапазон:

int idx = String.valueOf(barcode).hashCode() % names.length;
if (idx < 0) idx += names.length;
...