Size: a a a

Clojure — русскоговорящее сообщество

2020 February 06

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
Пожалуйста :)
источник

a

akater in Clojure — русскоговорящее сообщество
Вопрос к опытным писателям transducer'ов: как бы вы запрограммировали (на Clojure) функцию выбора n случайных элементов из последовательности? Равномерное распределение. Последовательность конечная, ее длина считается известной изначально.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
akater
Вопрос к опытным писателям transducer'ов: как бы вы запрограммировали (на Clojure) функцию выбора n случайных элементов из последовательности? Равномерное распределение. Последовательность конечная, ее длина считается известной изначально.
источник

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
Вроде это не то что надо
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
трансдьюсеры она умеет
источник

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
Но это не равномерное распределение, если я не ошибаюсь
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
и ему нужно заданные n элементов
источник

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
И n элементов оно не всегда наберет
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
(->> coll cycle (random-sample 0.5) (take n))
наверно тут что-то не так с распределением и вообще, но для каких-то случаев подойдет
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
ну и distinct можно еще сделать
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
akater
Вопрос к опытным писателям transducer'ов: как бы вы запрограммировали (на Clojure) функцию выбора n случайных элементов из последовательности? Равномерное распределение. Последовательность конечная, ее длина считается известной изначально.
ещё можно так, про равномерность не знаю
последовательность бесконечная
(take 10 (repeatedly (partial rand-int 100)))
=> (81 12 73 57 42 42 1 62 9 81)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
ещё можно так, про равномерность не знаю
последовательность бесконечная
(take 10 (repeatedly (partial rand-int 100)))
=> (81 12 73 57 42 42 1 62 9 81)
ну и про трансдьюсеры тут ничего нет, последовательность и последовательность
упоминание трансдьюсеров непонятно к чему
источник

ɪᴋ

ɪɢᴏʀ ᴋʜᴀʀɪɴ in Clojure — русскоговорящее сообщество
akater
Вопрос к опытным писателям transducer'ов: как бы вы запрограммировали (на Clojure) функцию выбора n случайных элементов из последовательности? Равномерное распределение. Последовательность конечная, ее длина считается известной изначально.
Раз длина известна, то можно просто взять n (rand-int (count xs)) и сделать filter по map-indexed.
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
ɪɢᴏʀ ᴋʜᴀʀɪɴ
Раз длина известна, то можно просто взять n (rand-int (count xs)) и сделать filter по map-indexed.
Инты ж могут повториться
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
akater
Вопрос к опытным писателям transducer'ов: как бы вы запрограммировали (на Clojure) функцию выбора n случайных элементов из последовательности? Равномерное распределение. Последовательность конечная, ее длина считается известной изначально.
Не понял при чем здесь трансдьюсеры, но вот как - с вероятностью n/k берем первый элемент, ииии..... все ))) пришли к той же задаче на остатке элементов, рекурсия )
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
На этом алгоритме сделана генерация случайных графов в этом кложаскриптовом проекте https://codepen.io/Ivana-/full/BMxJPp
источник
2020 February 07

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Предположим, что мы имеем дело не с трансдьюсерами, а с вектором. Тогда нужно сначала случайно выбрать один из n элементов. Затем убрать его и выбрать случайно из (n-1) элементов и тд. Адекватно это лучше всего сделать через transient, свапать выбранный на k-ом шаге с k-м с конца (и соответственно генерировать случайный индекс от 1 до (n-k))
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Да. И чтобы не реализовывать это неоптимальный по времени и памяти алгоритм, был придуман описанный постом выше )
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
ЗЫ для ценителей расскажу словами еще один алгоритм. Отрезок [1;n] разбиваем пополам, и решаем задачу рекурсивно, разделяя K на две НЕРАВНЫЕ (очевидно, т.к. при равных будет эмуляция равномерной сетки, заполняющей интервал [1;n] с равномерным шагом) части по БИНОМИАЛЬНОМУ РАСПРЕДЕЛЕНИЮ (отлично аппроксимируется обычным Гауссом), далее каждую половину интервала так же разбиваем пополам с разделением части K этой половины интервала аналогично и т.д. Когда дошли до K=N берем все точки интервала, когда K=0 прекращаем безобразие и ничего не берем из этого интервала. Нафига такие сложности - алгоритм выше имеет временнУю сложность O(n), а описанный O(k). Если k сравнимо с n, то проще не морочиться и взять однострочник выше. Если n велико, а k относительно мало - то описанный алгоритм.
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Andrey Ivanov
Не понял при чем здесь трансдьюсеры, но вот как - с вероятностью n/k берем первый элемент, ииии..... все ))) пришли к той же задаче на остатке элементов, рекурсия )
А что такое n и k здесь?
источник