Рейтинг:2

Детерминировано создать массив индексов на основе входного числа

флаг in

См. раздел «Справочная информация» ниже для получения терминов.

Существует ли известный односторонний метод создания массива индексов на основе только двух входных элементов:

  • длина результирующего массива
  • число, используемое в качестве ключа для детерминированного создания массива

Если существует только метод, который может создавать только массивы фиксированной длины - это тоже может быть хорошим началом для меня.

Примеры:

Длина Введите номер Результирующий массив индексов
4 10001 [3, 0, 2, 1]
4 10002 [2, 3, 1, 0]
5 10001 [2, 3, 4, 1, 0]
5 10002 [4, 3, 0, 1, 2]

Справка:

  • ан массив индексов:
    Массив, значениями которого являются все целые числа от 0 до (длина массива - 1), неупорядоченный.
  • детерминированный функция:
    Функция, дающая один и тот же результат каждый раз, когда предоставляются одни и те же входные данные.
Рейтинг:2
флаг es

Начните с массива отсортированных индексов.

Дюрстенфельд перетасовать работает, проходя через массив, обрабатывая одну часть массива как перетасованную, а остальную часть массива - как не перетасованную. Он просто заменяет каждый элемент в массиве случайным элементом из неперетасованной области до тех пор, пока массив не будет полностью перемешан.

Все перестановки будут равновероятными.

Детерминированный CSPRNG (с введенным вами числом) используется для генерации случайных индексов, выбранных во время перемешивания.

const csprng = new csprng(<начальное число ввода>);
константа len = 10;
const a = новый массив (длина);
for(пусть i=0; i<len; i++) a[i] = i;

for(пусть i=0; i<len; i++) {
  пусть swapIndex = nextDeterministicallyRandomIntBetween (i, len, csprng);
  пусть tmp = a[i]; а[я] = а[индекс подкачки]; а[индекс подкачки] = tmp; // менять
}

функция nextDeterministicallyRandomIntBetween(lowerBoundInclusive, 
    upperBoundExclusive, csprng) {

  вернуть нижнюю границу включающую +
    nextDeterministicallyRandomIntLowerThan (upperBoundExclusive-lowerBoundInclusive, csprng);
}

функция nextDeterministicallyRandomIntLowerThan (upperBoundExclusive, csprng) {
  // определить минимальное количество битов "b", необходимое для представления
  // (upperBoundExclusive-1). Затем несколько раз запросите у csprng b бит.
  // пока он не вернет результат ниже, чем upperBoundExclusive
  пусть b = Math.ceil(Math.log(upperBoundExclusive) / Math.log(2));
  пусть р;
  делать {
    г = csprng.nextBits (b);
  } while (r>=upperBoundExclusive);
  вернуть р;
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.