2011-01-13 2 views
0

임의의 변수를 여는 중괄호와 일치하는 닫는 중괄호 시퀀스를 만들고 싶습니다. 그것은 각 셔플의 새로운 ord를 생성하기 때문에Haskell에서 무작위 변수를 여러 번 사용하기

shuffle :: [a] -> IO [a] 
ps xs ys = map snd . sort $ zip xs ys 

opens = "[{(" 
closes = "]})" 

parens = do 
ord <- shuffle [0..length opens] 
    let os = ps ord opens 
     cs = reverse $ ps ord closes 

그것은 작동하지 않습니다 여기 내 (일부) 코드입니다. ord을 기억하고 두 셔플 모두에 사용하려면 어떻게해야합니까?

+0

코드가 덜 부분적이라면 질문에 대답하는 것이 더 쉬울 것이라고 생각합니다. (적어도 정확한 구문을 제공합니다.) 바로 지금 당신의 문제가 무엇인지 정확히 알기가 어렵습니다. – HaskellElephant

답변

0

개별적으로 임의로 셔플하지 마십시오.

완료하면 zip 족제비 순서를 섞고 unzip을 섞으십시오.

0

Oleg의 Provably perfect shuffle algorithms 또는 System.Random.Shuffle 구현을 보았습니까?

매우 (불완전한) 코드를 다시 읽으면 주변 코드에 대해 몇 가지 가정을하고 일 수 있습니다. 더 무엇이 잘못되었는지 판단 할 수 있도록 더 많이 보여주십시오.

제쳐두고, map fst . sortBy (comparing `on` fst) . zip xs 또는 map fst . sortWith fst . zip xs을 사용하면 하나의 목록을 다른 목록으로 주문하는 것이 더 명확하게 나타납니다.

관련 문제