6 votes

Distributions non-uniformes pour les types de données Haskell

El au hasard contient une classe de type Uniform pour les types uniformément répartis. Cela fonctionne pour des types comme :

data Coin = Heads | Tails

Mais disons que je veux modéliser un ensemble de choses avec une distribution non uniforme, par exemple en ajoutant la possibilité que la pièce tombe sur le côté :

data Coin = Heads | Tails | Side

Maintenant, je pourrais toujours mettre en œuvre Uniform avec une distribution non-uniforme dans son implémentation, mais ce serait mentir aux règles implicites de Uniform .

Dois-je me contenter d'utiliser une fonction autonome ou existe-t-il une sorte de classe pour le concept de distribution "réelle" ?

Cette classe de types serait utile dans le contexte d'un RPG où l'on pourrait avoir certains types

data Rarity = Common | Rare
data DropType = Club | Sword

où les chances d'obtenir un Rare et le fait que ce soit un Sword pourrait être inférieure aux autres valeurs. Mais le concept de tirer une valeur de l'ensemble de toutes les valeurs de ce type est toujours le même pour les valeurs suivantes Rarity y DropType c'est pourquoi cela ressemble à un travail pour les classes de type pour moi.

2voto

Sam Mason Points 1389

Une option consiste à utiliser random-fu qui offre une distribution catégorielle . Un exemple rapide :

import Data.Random
import Data.Random.Distribution.Categorical
import Data.Random.Sample

data Coin = Heads | Tails | Side deriving Show

-- set up distribution, weights don't have to sum to 1
coin :: Categorical Double Coin
coin = fromList [(0.5, Heads), (0.5, Tails), (0.001, Side)]

-- draw a single sample from the distribution
main = sample coin >>= print

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X