STArray
我想通过使用局部突变效果和功能随机数生成器来实现没有副作用的 Fisher-Yates 算法(就地数组洗牌)
type RNG[A] = State[Seed,A]
产生算法所需的随机整数。
我有一种方法def intInRange(max: Int): RNG[Int]
可以用来Int
在 [0,max) 中产生随机数。
来自维基百科:
To shuffle an array a of n elements (indices 0..n-1): for i from n − 1 downto 1 do j ← random integer such that 0 ≤ j ≤ i exchange a[j] and a[i]
我想我需要以某种方式堆叠State
,ST
但这让我感到困惑。我需要一个[S]StateT[ST[S,?],Seed,A]
吗?我是否也必须重写RNG
才能使用StateT
?
(编辑)我不想参与IO
,也不想替代Vector
,STArray
因为洗牌不会就地执行。
我知道这里有一个 Haskell 实现,但我目前无法理解并将其移植到 Scalaz。但也许你可以?:)
提前致谢。