gpt4 book ai didi

random - 为什么在 Clojure 中使用种子时不会重复生成可重现的随机数?

转载 作者:行者123 更新时间:2023-12-04 00:52:26 25 4
gpt4 key购买 nike

我有一些需要一系列随机数的函数,所以我采用了一些简单的原语,例如 #(inc (g/uniform 0 n))而且我似乎无法生成可重复的随机数系列,即使我正在重新绑定(bind) *rnd* ,除非我如下所示生成它们。我无法想象这是最好的方法,所以有人能指出如何做得更好吗?

注意:我将下面的每个示例运行 3 次,以产生给定的结果。

(ns example.show
(:require [clojure.data.generators :as g]))


(binding [g/*rnd* (java.util.Random. 42)]
(take 10 (repeatedly #(inc (g/uniform 0 n))))

=> (9 4 5 4 4 5 1 8 2 9)

=> (2 1 1 6 3 10 10 4 1 9)

=> (10 4 7 8 9 6 10 1 8 3)


(binding [g/*rnd* (java.util.Random. 42)]
(g/reps 10 #(inc (g/uniform 0 n)))

=> (3 9 4 6 3 8 6 6 5 4)

=> (7 8 4 7 7 5 7 4 8 7)

=> (2 8 7 8 8 8 9 2 6 5)

;; This seems to work
(binding [g/*rnd* (java.util.Random. 42)]
(letfn [(roll [n] #(inc (g/uniform 0 n)))]
[((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10))]))

=> [8 7 4 3 7 10 4 3 5 8]

=> [8 7 4 3 7 10 4 3 5 8]

=> [8 7 4 3 7 10 4 3 5 8]

最佳答案

因为懒惰。您从 binding 返回在序列实现之前。因此,惰性序列永远不会看到您设置的绑定(bind)。一种解决方案是使用 doall 强制实现。关于绑定(bind)内部的序列。

关于random - 为什么在 Clojure 中使用种子时不会重复生成可重现的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22441860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com