@toster111

Как перемешать массив в псевдослучайной последовательности?

Добрый день!
Представим, что у нас есть две сущности, например, статьи (статья А и статья Б)
У каждой статьи есть массив хэштегов (если статьи принадлежат к одной теме, то массивы хэштегов идентичны, если к разным - различны), в нашем случае статья А и статья Б относятся к одной теме

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

Очевидно, здесь не подойдет сортировка массива по рандомно сгенерированным числам
Была мысль генерировать числа на основе уникального идентификатора статьи (id вида 2613221) и сортировать по ним, но не совсем понятно, как это сделать, учитывая то, что длина массива хэштегов неизвестна
Какие могут быть еще варианты?
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg
Баянист. Тамада. Услуги.
Генератор случайных чисел и так работает на основе некоего стартового значения (seed). Так что если вы ему скормите ID статьи, он ван наштампует всегда одинаковый, но случайный набор чисел.
Ответ написан
nikonor
@nikonor
Программист go, perl
Да раздели 1000000 на это id и бегите по цифрам после запятой. Тут же важно получить просто условно бесконечную, но одинаковую последовательность цифр
Ответ написан
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Есть много разных решений. Можно взять любой алгоритм перемешивания и инициализировать генератор случайных чисел номером статьи.

Или можно сортировать хеши, полученные из id тега и id статьи. Например, можно подсчитать tag_id*article_id % n.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы