Ich möchte eine Liste mit einer zufälligen Permutation der Zahlen von 1 bis N erstellen. Wie ich es verstehe, ist es möglich, VUM.swap
in der verwenden runST, aber da ich auch Zufallszahlen benötige, dachte ich, ich könnte beides in der IO-Monade machen.Erstellen einer zufälligen Permutation von 1..N mit Data.Vector.Unboxed.Mutable
Der folgende Code ergibt:
erwarteten Typ: IO (VU.Vector Int), tatsächliche Typ: IO (VU.Vector (VU.Vector a0))
für die Rücksendeanweisung.
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Unboxed.Mutable as VUM
import System.Random
randVector :: Int -> IO (VU.Vector Int)
randVector n = do
vector <- VU.unsafeThaw $ VU.enumFromN 1 n
VU.forM_ (VU.fromList [2..VUM.length vector]) $ \i -> do
j <- randomRIO(0, i) :: IO Int
VUM.swap vector i j
return $ VU.unsafeFreeze vector
Ich bin nicht ganz sicher, warum der Rückkehrvektor verschachtelt ist. Muss ich stattdessen VU.fold1M_
verwenden?
Das hat den Trick! Die Return-Anweisung war das Problem. Wie kommt es, dass die Verwendung von return den Vektor verschachtelt? Das hätte ich nie herausgefunden. Ich habe 'VU.forM_' anstelle der einfachen Version verwendet, weil ich nicht sicher war, wo die einfache Version gefunden wurde. Die typische Eingangsgröße ist n = 50 und der Aufbau von 5000 RandV-Sektoren. Ich kann mir nicht vorstellen, dass die verschiedenen For-Schleifen viele Sekunden unterscheiden. – tsorn
Ich habe einen Kommentar zu den 'forM_'-Grenzen hinzugefügt und das Bit bei' forM_'-Leistung bearbeitet. –