Вопрос:

Предсказуемое перемешивание массива Javascript

javascript arrays random repeat

530 просмотра

3 ответа

74 Репутация автора

Я пытаюсь предсказуемо перемешать JavaScript-массивы одинаково при каждой загрузке веб-страницы.

Я могу перемешать массивы случайным образом, но каждый раз, когда я перезагружаю страницу, это другая последовательность.

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

Автор: Protopop Источник Размещён: 31.01.2015 09:03

Ответы (3)


4 плюса

42903 Репутация автора

Взгляните на функцию chancejs.comseed .

Автор: Billy Moon Размещён: 31.01.2015 09:11

5 плюса

74 Репутация автора

Chance.js работал отлично. Спасибо, Билли Мун.

Мой пример:

<script type="text/javascript" src="assets/js/chance.js"></script>

var chance1 = new Chance(124); // you can choose a seed here, i chose 124
console.log(chance1.shuffle(['alpha', 'bravo', 'charlie', 'delta', 'echo']));
// Array [ "alpha", "delta", "echo", "charlie", "bravo" ]

Пока вы устанавливаете семя с новым шансом (ххх), вы каждый раз получаете один и тот же результат.

Автор: Protopop Размещён: 31.01.2015 09:30

0 плюса

42903 Репутация автора

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

1. Генерация псевдослучайных чисел

Вы можете использовать другой PRNG, но Xorshift очень прост, его можно быстро инициализировать, проходить и равномерно распределять.

Эта функция принимает целое число в качестве начального значения и возвращает случайную функцию, которая всегда возвращает одинаковые значения с плавающей запятой в диапазоне от 0 до 1.

const xor = seed => {
  const baseSeeds = [123456789, 362436069, 521288629, 88675123]

  let [x, y, z, w] = baseSeeds

  const random = () => {
    const t = x ^ (x << 11)
    ;[x, y, z] = [y, z, w]
    w = w ^ (w >> 19) ^ (t ^ (t >> 8))
    return w / 0x7fffffff
  }

  ;[x, y, z, w] = baseSeeds.map(i => i + seed)
  ;[x, y, z, w] = [0, 0, 0, 0].map(() => Math.round(random() * 1e16))

  return random
}

2. Перемешать с помощью настраиваемой случайной функции

Перетасовка Fisher Йейтса является эффективным алгоритмом воспроизведения в случайном порядке с равномерным распределением.

const shuffle = (array, random = Math.random) => {
  let m = array.length
  let t
  let i

  while (m) {
    i = Math.floor(random() * m--)
    t = array[m]
    array[m] = array[i]
    array[i] = t
  }

  return array
}

Положить его вместе

// passing an xor with the same seed produces same order of output array
console.log(shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9], xor(1))) // [ 3, 4, 2, 6, 7, 1, 8, 9, 5 ]
console.log(shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9], xor(1))) // [ 3, 4, 2, 6, 7, 1, 8, 9, 5 ]

// changing the seed passed to the xor function changes the output
console.log(shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9], xor(2))) // [ 4, 2, 6, 9, 7, 3, 8, 1, 5 ]
Автор: Billy Moon Размещён: 02.04.2019 06:00
Вопросы из категории :
32x32