Мне нужно создать набор чисел, которые являются единообразными для отдельных пользователей, но уникальными для них - PullRequest
1 голос
/ 24 июня 2019

Как и выше, у меня есть массив.Скажем, например, [12, 24, 89, 09, 43, 99].

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

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

"{6051c670-5122-4f6c-95ff-5e6c538ed5c0}"

Любые идеи о том, как это может быть достигнуто, было бы полезно.

1 Ответ

1 голос
/ 24 июня 2019

Вы можете использовать генератор случайных чисел, например seedrandom

Как это работает:

Каждый генератор случайных чисел - это только генератор случайных чисел псевдо, то есть здесь нет ничего случайного, даже для Math.random - это просто какой-то сумасшедший алгоритм, который генерирует числа по заданному входу.

Но javascript заполняет Math своими собственными переменными и не позволяет нам самому заполнять его (как мы можем, например, в c) - вот где появляется seedrandom, это просто простой пользовательский генератор случайных чисел для javascript, который также случается, что строки принимаются как семя (хорошо для ваших нужд).

Мы подаем генератору случайных чисел специальное начальное число (идентификатор пользователя / сеанс), который позволяет нам иметь предсказуемый генератор случайных чисел - например, если первый вызов выдаст 0,2, а второй вызов - 0,5 - мы можем быть уверены, что если пользователь обновит страницу, и мы дадим одно и то же начальное число, первое число всегда будет равно 0,2, а второе число всегда будет равно 0,5.

Как использовать:

Использование довольно просто:

// Make a predictable pseudorandom number generator.
const seedrandom = require('seedrandom');

const myRandom = seedrandom(sessionID);
console.log(myRandom());  // Always 0.9282578795792454

// example
const pickRandomForUser = (items) => {
  const predictableRandom = myRandom();
  const randomIndex = Math.floor(predictableRandom * items.length);
  return items[randomIndex];
}

const numbers = [12, 24, 89, 09, 43, 99];

// will stay the same for each session id, in this order
const firstRand = pickRandomForUser(numbers)// 12
const secondRand = pickRandomForUser(numbers)// 89
...