@Extramezz

Как перемешать массив одинаково для всех?

У нас есть массив (к примеру) [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]. И есть число, к примеру 12837823632, оно периодически меняется (я получаю его с сервера).

Мне нужно на клиенте перемешивать этот массив, опираясь на данное число. Так, чтобы если сайт открыт на 10 устройствах - результат перемешивания отобразился одинаковый. К примеру, [1, 2, 1, 3, 3, 2, 1, 1, 2, 3, 3, 2, 2, 1, 3]. Но при этом результат должен быть уникальным, не таким каким был с предыдущим числом.

Если использовать Math.random(), то, разумеется, результат будет на всех устройствах разный.

В какую сторону копать?
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 4
twobomb
@twobomb
Псевдорандом
let arr = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3];
var seed = 12837823631;
arr = arr.sort((a,b)=>rand() - rand());

function rand(){
 	seed = (45 * seed + 21) % 67;
 	return seed/67;
}
Ответ написан
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Вот алгоритм для перемешивания массива, если у вас есть детерминированная функция rand(), которую вы каким-то seed проинициализровали.
for (i = 1; i<arr.length; ++i) {
 let j = floor(rand()*(i+1));
 let tmp = arr[i];
 arr[i] = arr[j];
 arr[j] = tmp;
}


Можно использовать что-то вроде функции, предложенной twobomb, но именно той функцией пользоваться не советую - она выдаст максимум 67 различных вариантов, а на самом деле сильно меньше. Используйте, например, параметры отсюда:
function rand(){
 	seed = (16,807*seed) % 2,147,483,647;
 	return seed/2,147,483,647;
}
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Я задавал похожий вопрос.
Посмотрите.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы