Функция shuffle
из стандартной библиотеки Random
может использоваться для перемешивания контейнера в случайном порядке:
julia> using Random: shuffle
julia> shuffle(1:10)
10-element Array{Int64,1}:
6
9
3
2
10
1
8
7
5
4
Функция Iterators.partition
из Base
Джулии может использоваться для итерации. для итерируемой порции фиксированной длины:
julia> using Base.Iterators: partition
julia> partition(1:20, 7)
Base.Iterators.PartitionIterator{UnitRange{Int64}}(1:20, 7)
Однако partition
возвращает ленивый итератор по умолчанию, поэтому, если мы хотим реализовать фактический результат, нам нужно collect
it:
julia> collect(partition(1:20, 7))
3-element Array{UnitRange{Int64},1}:
1:7
8:14
15:20
Собрав все это вместе, мы получим
julia> using Random: shuffle
julia> using Base.Iterators: partition
julia> shuffle_partition(N; chunk_size=128) = (collect ∘ partition)(shuffle(1:N), chunk_size)
shuffle_partition (generic function with 1 method)
julia> shuffle_partition(503)
4-element Array{SubArray{Int64,1,Array{Int64,1},Tuple{UnitRange{Int64}},true},1}:
[313, 51, 117, 373, 381, 340, 342, 415, 423, 453 … 201, 178, 167, 242, 2, 76, 146, 439, 363, 448]
[115, 121, 306, 440, 295, 181, 30, 280, 388, 227 … 362, 39, 317, 171, 55, 214, 261, 251, 96, 9]
[486, 248, 161, 319, 325, 176, 80, 369, 434, 209 … 442, 350, 273, 419, 130, 305, 192, 482, 265, 234]
[460, 31, 400, 466, 220, 447, 119, 446, 198, 141 … 226, 438, 74, 152, 203, 303, 378, 231, 458, 194]
julia> length.(ans)
4-element Array{Int64,1}:
128
128
128
119
Этот ответ основан на ответе, найденном в Slack.