Я написал следующий код для генерации всех возможных комбинаций некоторых чисел:
let allCombinations (counts:int[]) =
let currentPositions = Array.create (counts.Length) 0
let idx = ref (counts.Length-1)
seq{
while currentPositions.[0]<counts.[0] do
yield currentPositions
currentPositions.[!idx]<-currentPositions.[!idx]+1
while currentPositions.[!idx] >= counts.[!idx] && !idx>=1 do
currentPositions.[!idx]<-0
idx:=!idx-1
currentPositions.[!idx]<-currentPositions.[!idx]+1
idx:=counts.Length-1
}
Я использую последовательность в какой-то другой части программы, например:
allCombinations counts |> Seq.map (fun idx -> buildGuess n digitsPerPos idx) ...
Все идет нормально.Программа работает как положено и генерирует комбинации.Для входа [| 2; 2; 2 |] он генерирует восемь значений:
[|0; 0; 0|]
[|0; 0; 1|]
[|0; 1; 0|]
[|0; 1; 1|]
[|1; 0; 0|]
[|1; 0; 1|]
[|1; 1; 0|]
[|1; 1; 1|]
Однако, когда я использую PSeq для распараллеливания сгенерированной последовательности, все значения, которые должны быть использованы, изменяются на [| 2; 0; 0|], которое является последним значением массива currentPositions в цикле while выше.
Если я использую
yield (currentPositions|>Array.copy)
вместо
yield currentPositions
, все работает нормально вкак последовательные, так и параллельные версии.
Почему это происходит;Есть ли самый эффективный способ получить результат;Заранее спасибо;