微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Haskell 数据类型的非均匀分布

如何解决Haskell 数据类型的非均匀分布

random 包包含一个用于均匀分布类型的类型类 Uniform。 这适用于以下类型:

data Coin = Heads | Tails

但是假设我想对一组具有非均匀分布的事物进行建模,例如通过添加硬币落在其一侧的可能性:

data Coin = Heads | Tails | Side

现在我仍然可以在其实现中使用非均匀分布来实现 Uniform,但这会违背 Uniform 的隐含规则。

我是否只需要使用一个独立的函数,或者是否有一些类型类用于“实际”分布的概念?

这个类型类在可以拥有某些类型的 RPG 上下文中很有用

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

获得 Rare 和它是 Sword 的机会可能低于其他值。 但是从该类型的所有值的集合中提取值的概念对于 RarityDropType 仍然相同,这就是为什么这对我来说看起来像是类型类的工作。

解决方法

一种选择是使用 random-fu,它提供 a categorical distribution。一个简单的例子:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。