Как преобразовать дату в случайный индекс в списке? - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно что-то, что генерирует случайный элемент из списка, но этот элемент рандомизируется каждый день и является согласованным для всех пользователей.Это на веб-сайте и, следовательно, с использованием JavaScript (хотя на самом деле мне просто нужен алгоритм, которому вы будете следовать, не обязательно сам код).

У меня есть день, месяц,и год хранится в переменных, но что я могу сделать, чтобы преобразовать это в целое число от 0 до длины списка?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Простой алгоритм:

Пара 3 целых числа в 1:

seed = pair(day, pair(month, year))

используйте этот int для создания случайного числа генератор , для желаемой случайности

seed -> [0, 1, 2, ..., array.length - 1]

index = Math.round(randomOf(seed) * (array.length - 1));
element = array[index]

Вот базовая реализация javascript вышеупомянутой функции сопряжения:

function pair(x, y) { return ((x + y) * (x + y + 1)) / 2 + y; }

реализующий randomOf (проверьте ссылку выше для «генератора случайных чисел»):

randomOf(seed){
   Math.seedrandom(seed);
   return Math.random();
}
0 голосов
/ 28 февраля 2019

Вы можете использовать это https://github.com/davidbau/seedrandom. Так что идея состоит в том, чтобы изменить начальное значение для случайной функции на дату (может быть, только месяц, день и год).Например:

Math.seedrandom('August 19, 1975');
console.log(Math.random());    // 0.8213442237794714
console.log(Math.random());    // 0.9082914871756658

, а затем для преобразования его в целое число вы можете использовать описанную здесь функцию:

function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min;
}

edit:

Затем, например, использоватьэто получить что-то в массиве


<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre class="snippet-code-js lang-js prettyprint-override"><code>function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
}

let arr = ['firsEl', 'secondEl', 'thirdEl', 'fourthEl'];
let d = new Date(); //get todays date
let month = d.getMonth();
let day = d.getDate();
let year = d.getFullYear();
//make the random with seed
Math.seedrandom(`${month} ${day}, ${year}`);
//and finally using the function for int
let item = arr[getRandomInt(0, arr.length)]; 
console.log(item);
<script src="http://cdnjs.cloudflare.com/ajax/libs/seedrandom/2.4.4/seedrandom.min.js"></script>
...