【发布时间】:2016-09-11 22:35:49
【问题描述】:
我正在尝试在 Elm 中编写一个伪随机生成器(在屏幕上生成点),但并不那么容易,因为它会干扰 Elm 编译器的“纯度”。
好的,那为什么不写我们自己的函数呢?如果我们编写如下内容,我们可以获得某种随机行为:
-- initial state
randomNumbers = [ 1 ]
x = 1
b = 2
n = 2017
-- generate random numbers
x = (x*b) % n
randomNumbers = x :: randomNumbers
这不符合 Elm 的变量赋值规则。出了点问题。
我所做的只是寻找 2 mod 2017 的力量。前几个很容易,但随后的顺序变得不可预测。所以我需要跟踪计算的最后一个数字。
[ 1, 2, 4, 8, ... , 1024, 31, 62, 124, ...]
即使我尝试使用算术的特殊属性,我仍然需要计算这个稀疏的幂列表
[ 1, 2^1, 2^2, 2^4, 2^8, 2^16, ... ]
我可以通过successive squaring解决吗,但我仍然需要一些方法来记住最后一步。
我想……只要我编写自己的代码,我就不必从“现实世界”中导入随机性来生成我的公平数字。这种方式尊重榆树的纯净。然而,我最终写了一些有状态的东西。
Elm确实现在在Random 库中有一个随机数生成器 - 一些算法的实现,返回一个generator 类型。
这个 repl 会话很有启发性:
> import Random exposing (..)
>
> initialSeed 0
Seed {
state = State 1 1 ,
next = <function>,
split = <function>,
range = <function>
}
: Random.Seed
> seed0 = initialSeed 101
Seed {
state = State 102 1, ,
next = <function>,
split = <function>,
range = <function>
}
: Random.Seed
> step ( int 0 10 ) seed0
(10,Seed { state = State 4081428 40692, ,
next = <function>,
split = <function>,
range = <function>
}
: ( Int, Random.Seed )
即使使用我简化的婴儿随机数生成器,这里还有什么状态?
如果我说 memoizaton 而我的意思是 动态编程 或其他方式,我提前道歉
What is the difference between memoization and dynamic programming?
如果我可以编写一个有状态的函数f 来记住事情,我可以只用一行来生成我所有的值:
List.map f [1..100]
【问题讨论】:
-
一个更合适的标题可能是“Elm 中的递归”或“Elm 中的动态编程”
标签: dynamic-programming memoization elm