Начните с массива отсортированных индексов.
Дюрстенфельд перетасовать работает, проходя через массив, обрабатывая одну часть массива как перетасованную, а остальную часть массива - как не перетасованную. Он просто заменяет каждый элемент в массиве случайным элементом из неперетасованной области до тех пор, пока массив не будет полностью перемешан.
Все перестановки будут равновероятными.
Детерминированный 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);
вернуть р;
}