Je fais un jeu en orme et essaye de placer aléatoirement N robots maléfiques sur une grille avec des cellules ROWS x COLS.Elm - liste de nombres aléatoires sans doublons
Ce que je voudrais, c'est une paire List (Int, Int) qui spécifie où placer les N robots.
je peux faire une liste de paires de coordonnées avec
makeGrid : Seed -> List (Int, Int)
makeGrid seed =
let gen = list n <| pair (int 0 rows) (int 0 cols)
in
fst (generate gen seed)
C'est très bien. Mais si je veux générer une liste de unique paires?
Dois-je faire la solution impérative où je garde un ensemble de mes choses et en ajoutant jusqu'à ce que j'en ai assez?
Peut-être quelque chose comme ça (probablement tort, n'a pas vérifié dans le REPL):
makeN : Int -> Seed -> (List (Int, Int), Seed)
makeN n seed =
let gen = list n <| pair (int 0 rows) (int 0 cols)
in
generate gen seed
makeGrid : List(Int, Int) -> Seed -> Int -> List (Int, Int)
makeGrid partial seed n =
case of List.length partial
n -> partial
current ->
let (new_elems, new_seed) = makeN (n - current) seed
makeGrid Set.toList (Set.fromList <| append partial new_elems) new_seed n
Cela se sent hors tension. J'ai pensé à 3 alternatives:
Faire ma grille une liste de lignes * COLS paires de coordonnées avec, puis mélangez liste de type (Int, Int), et prendre les premières paires N dans la liste de lieu mes robots. Cela semble très concis et propre, mais inefficace/mauvais si le nombre de points uniques dont j'ai besoin est beaucoup plus petit que ma grille, et si ma grille est grande (comme Fisher-Yates est O (n log (n)) je pense). Utilisez quelque chose comme this package pour échantillonner à partir de ma grille sans remplacement, mais j'ai besoin de changer ma grille dans un tableau et il semble qu'il y ait beaucoup de division et d'épissage des opérations de tableaux, ce qui semble coûteux.
Utilisez le JS FFI pour l'implémenter dans une boucle JS à 4 lignes.
Aucune de ces solutions ne se sent bien, y a-t-il quelque chose qui me manque? Je vais probablement simplement changer la mécanique du jeu pour que chaque cellule ait une probabilité P d'avoir un robot dessus, donc c'est plus simple à implémenter.
Juste après avoir posté ceci, il me semble que je devrais être capable d'utiliser un générateur spécial pour cela. Je regarde Random.Extra, le générateur Set et certaines des méthodes de la famille generateUntil listées. –
Cela ressemble à la bonne approche. Assurez-vous d'ajouter une réponse à votre question si vous le comprenez. – Apanatshka