为什么随机数总是return偶数

Why does random always return an even number

我想学习 Elm,目前我想用包含索引和随机数的元组创建一个随机列表。
我目前的方法是创建一个列表并为每个元素创建一个随机值:

randomList = 
    List.map randomEntry (List.range 0 1000)

randomEntry index =
    let
        seed = Random.initialSeed index
        randomResult = Random.step (Random.int 1 10) seed
    in
        (index, Tuple.first randomResult)

但这只会产生偶数。

为什么它总是生成偶数,正确的做法是什么?

奇怪 - 使用你的 randomEntry 函数,第一个奇数直到 53668 才开始出现,然后它有一段时间是奇数。来自 REPL 的示例:

> List.range 0 100000 |> List.map randomEntry |> List.filter (\(a,b) -> b % 2 /= 0) |> List.take 10
[(53668,35),(53669,87),(53670,1),(53671,15),(53672,29),(53673,43),(53674,57),(53675,71),(53676,85),(53677,99)]
    : List ( Int, Int )

现在我不能告诉你为什么在这个范围内有这样的粘性 (here's the source for the int generator if you're curious),但希望我能阐明 Elm 中的随机性。

确实没有办法使用标准计算技术(除了量子计算机)创建真正的随机数生成器,因此创建随机性的典型方法是提供一个采用种子值的函数,returns一个伪随机数和下一个要使用的种子值。

这使得随机数生成变得可预测,因为对于相同的种子,您总是会得到相同的 "random" 数字。

这就是为什么对于您所提供的输入总是得到相同结果的原因:您使用的是从 0 到 1000 的相同种子值。此外,您忽略了从step 函数,作为元组的第二个值返回。

现在,在处理随机数生成器时,尽可能避免处理种子是一个很好的经验法则。您可以通过在 intlist 等较小的生成器上构建而不引用种子来编写生成器。

您执行生成器的方式是通过从 update 函数返回从 Random.generate 生成的 Cmd,这将决定使用哪个种子的责任留给了 Elm 架构(这可能使用一些基于时间的种子),或者您可以使用 Random.step 传递种子,您在上面已经完成了。

因此,回到您最初的示例,如果您要编写一个生成器来返回一定大小的随机数列表,其中每个数字都在一定范围内,它可能看起来像这样:

randomListGenerator : Int -> (Int, Int) -> Random.Generator (List Int)
randomListGenerator size (low, high) =
    Random.list size (Random.int low high)

在 REPL 中使用 step 执行此操作显示了如何使用它:

> initialSeed 0 |> step (randomListGenerator 20 (1, 10)) |> Tuple.first
[6,6,6,1,3,10,4,4,4,9,6,3,5,3,7,8,3,4,8,5] : List Int

您会发现这包括一些奇数,这与您最初的示例不同。它与您的示例不同的事实是因为生成器 returns 是使用每个连续步骤的下一个种子,而您的示例按顺序使用整数 0 到 1000。我仍然无法解释你最初的问题,即为什么使用你的原始输入会有这么大的偶数块,只能说这很奇怪。