Я бы, вероятно, не использовал Рамду для этого.Обратите внимание, что я один из основателей Ramda и большой поклонник.Но Рамда предназначена для функционального программирования.Одним из главных принципов функционального программирования является использование чистых функций, которые не используют входные данные вне своих аргументов и не имеют никаких эффектов, кроме как для возврата значения.Для одного и того же входа они должны всегда возвращать один и тот же результат.Это не будет работать, когда код должен что-то делать случайным образом. 1
Вы можете использовать код, подобный тому, что делает для этого lodash, версия Fisher- с ранним возвратомYates shuffle или вы можете использовать что-то вроде этого, которое также сохраняет свои результаты в порядке, указанном в исходном массиве:
const sampleSize = (size, list, collected = []) => size < 1 || list.length < 1
? collected
: size >= list.length
? [...collected, ...list] // or throw error?
: Math.random() < size / list.length
? sampleSize(size -1, list.slice(1), [...collected, list[0]])
: sampleSize(size, list.slice(1), collected)
console.log(sampleSize(4, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
console.log(sampleSize(4, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
console.log(sampleSize(4, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
console.log(sampleSize(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
console.log(sampleSize(10, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
console.log(sampleSize(20, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
Это было написано на скорую руку и может содержать ошибки, но должно быть довольно близко.Идея состоит в том, чтобы проверять каждый элемент по одному, чтобы увидеть, должен ли он быть включен, корректируя шанс в зависимости от того, сколько осталось включить и сколько осталось в списке.
Версия Фишера-Йейтсабудет более эффективным, чем это, особенно если использовать рекурсию, которая даже сегодня не может быть эффективно оптимизирована двигателями, даже если спецификация требует этого уже несколько лет.Но Фишер-Йейтс не сохраняет первоначальный порядок сортировки.Если вы этого хотите, этот может быть для вас.
1 Обратите внимание, что в какой-то момент Рамда имел расширение случайного числа , но этодавно отброшенОн использовал воспроизводимый генератор псевдослучайных чисел, который звучит почти как оксюморон, но имеет смысл при работе с чистыми функциями.