Делая заметку от ivanm, я думаю, что подходы - это путь для этого.
import Data.Set as Set
import System.Random (RandomGen, getStdGen)
startSet :: Set (Int, Int)
startSet = Set.fromList [(1,2), (3,4)] -- etc. Whatever the initial set is
-- grow the set by randomly producing "n" elements.
growSet :: (RandomGen g) => g -> Set (Int, Int) -> Int -> (Set (Int, Int), g)
growSet g s n | n <= 0 = (s, g)
| otherwise = growSet g'' s' (n-1)
where s' = Set.insert (x,y) s
((x,_), g') = randElem s g
((_,y), g'') = randElem s g'
randElem :: (RandomGen g) => Set a -> g -> (a, g)
randElem = undefined
main = do
g <- getStdGen
let (grownSet,_) = growSet g startSet 2
print $ grownSet -- or whatever you want to do with it
Это предполагает, что randElem
- эффективный, определяемый метод для выбора случайного элемента из набора.(Я задал этот SO вопрос относительно эффективных реализаций такого метода).При написании этой реализации я понял, что она может не соответствовать вашим потребностям, поскольку Set
s не может содержать повторяющиеся элементы, и мой алгоритм не может придать дополнительный вес парам, которые появляются в списке несколько раз.