Я буду использовать F # списки (списки списков чисел), потому что это легче начать, чем матрицы.Итак, предполагая, что у нас есть пример ввода и генератор случайных чисел:
let rnd = System.Random()
let inputMatrix =
[ [ 1.1; 1.2; 1.3 ]
[ 2.1; 2.2; 2.3 ]
[ 3.1; 3.2; 3.3 ] ]
Я думаю, что самый простой способ создать список, в котором строки расположены в случайном порядке, - это перебирать строки с List.map
,сгенерируйте случайное число для каждой строки, а затем отсортируйте строки:
inputMatrix
|> List.map (fun row -> rnd.Next(), row)
|> List.sortBy fst
|> List.map snd
Это довольно функционально, и я думаю, что оно вполне читабельно, поэтому это было бы моим предпочтительным решением.Требуется пара итераций по списку, так что вы не можете сделать это только с одним fold
.
Вы можете решить эту проблему, используя fold
, но тогда вам нужна другая стратегия.Вы можете перебирать строки и вставлять текущую строку в произвольной точке в новую матрицу, которую вы строите, когда вы проходите по строкам:
([], inputMatrix)
||> List.fold (fun matrix row ->
let split = rnd.Next(matrix.Length + 1)
List.take split matrix @ [row] @ List.skip split matrix)
Это начинается с пустой матрицы []
и каждый шагinputMatrix
выбирает точку разделения и вставляет туда новую строку.Эта часть довольно неэффективна, но это решение, использующее fold
.
Обратите внимание, что это хороший функциональный способ работы, но если вы заботитесь об эффективных матричных операциях, вероятно, лучше сделать несколькоУровень императивного кодирования для такой базовой функции - если только библиотека, которую вы используете, уже предоставляет ее.