Использование одной случайной величины несколько раз в Haskell - PullRequest
0 голосов
/ 13 января 2011

Хотелось бы сделать случайную последовательность открывающих скобок и соответствующую последовательность закрывающих скобок. Вот мой (частичный) код:

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 для каждого шаффла. Как сделать так, чтобы он запомнил ord и использовал его для обеих случайных комбинаций?

Ответы [ 2 ]

0 голосов
/ 13 января 2011

Видели ли вы, что Олег Возможно совершенные алгоритмы случайного перемешивания или System.Random.Shuffle реализация?

После перечитывания вашей (очень неполной)), кажется, что может быть правильным, делая некоторые предположения об окружающем коде.Пожалуйста, покажите больше, чтобы мы могли определить, что может быть не так.

Кроме того, использование map fst . sortBy (comparing &#96;on&#96; fst) . zip xs или map fst . sortWith fst . zip xs более четко выразит ваше намерение упорядочить один список за другим.

0 голосов
/ 13 января 2011

Не тасуйте их отдельно.

Перемешайте последовательность zip ped и unzip, когда вы закончите.

...