当前位置: 首页 > 知识库问答 >
问题:

如何用rand-int生成可重复随机序列

郭璞
2023-03-14

我希望能够在Clojure中使用rand生成可重复的数字。(具体地说,我希望对rand-nth或incanter的sample的调用结果是可重复的,这些调用会调用rand-int,而后者又会调用rand)。

我从这个问题中琢磨出,如果我使用Clojure.data.generators,我可以重置随机状态:

(require '[clojure.data.generators :as gen])
(alter-var-root #'gen/*rnd* (constantly (java.util.Random. 437)))
(gen/reservoir-sample 5 (range 1000)) ; => [940 591 636 12 755]
(gen/reservoir-sample 5 (range 1000)) ; => [376 540 827 307 463]
; reset random state:
(alter-var-root #'gen/*rnd* (constantly (java.util.Random. 437)))
; now the same results are generated again:
(gen/reservoir-sample 5 (range 1000)) ; => [940 591 636 12 755]
(gen/reservoir-sample 5 (range 1000)) ; => [376 540 827 307 463]

但是,该方法似乎只影响Clojure.data.generators中的函数,这并不奇怪:

(alter-var-root #'gen/*rnd* (constantly (java.util.Random. 437)))
(rand) ; => 0.9372552374760151
(rand) ; => 0.2712729314667742
; reset random state:
(alter-var-root #'gen/*rnd* (constantly (java.util.Random. 437)))
; not same results as before:
(rand) ; => 0.630238593767316
(rand) ; => 0.426744420572015

如何恢复随机状态,以便从rand中获得可重复的结果?到目前为止,我还没有找到任何关于这一点的文档。

(另一个问题听起来似乎是同一个问题,但它问的是完全不同的问题。)

共有1个答案

柴赞
2023-03-14

可能不是最干净的方法,但您可以通过重新定义clojure.core/rand来使其工作:

(ns clojure.core)

(def r (java.util.Random. 1))

(defn rand
  ([] (.nextDouble r))
  ([n] (.nextInt r n)))

(take 10 (repeatedly #(rand-int 10)))

每次运行它时都会生成(5 8 7 3 4 4 4 6 8 8)。

 类似资料:
  • 问题内容: 我想要一个可以生成值的伪随机序列的函数,但是该序列在每次运行时都可以重复。我想要的数据必须合理地随机分布在给定的范围内,而不必是完美的。 我想根据随机数据编写一些可以对其进行性能测试的代码。我希望每台机器上的每个测试运行的数据都相同,但是出于存储原因,我不想随测试一起运送随机数据(最终可能会变成许多兆字节)。 该模块的库似乎没有说相同的种子在任何机器上总是给出相同的序列。 编辑:如果您

  • 我正在尝试实现一个函数int choose_N(void),它生成并返回一个随机的整数列表N(最多四个整数)。我不确定我是否以正确的方式使用了rand(),但这是我目前所拥有的: 这样循环会有用吗?时间是否以正确的方式初始化?

  • 我正在尝试生成位随机数。我可以生成一个随机数,但这里的情况是生成一个位数字。我尝试通过将随机数存储在数组中来执行此操作,但我需要它以长长格式而不是数组。

  • 本文向大家介绍如何在Python中生成非重复随机数?,包括了如何在Python中生成非重复随机数?的使用技巧和注意事项,需要的朋友参考一下 接下来的程序会生成10个介于1到100之间的随机非重复整数。它会在给定的时间间隔内生成一个随机整数,如果先前未添加过该整数,则将其添加到列表中。

  • 问题内容: 我想创建一组随机数,在Java中没有重复项。 例如,我有一个数组来存储10,000个从0到9999的随机整数。 这是我到目前为止的内容: 但是上面的代码创建重复项。如何确保随机数不重复? 问题答案: 例如:

  • 如何在1到9之间生成9个随机数,而不重复,一个接一个。它类似于:假设生成的第一个随机数是4,那么下一个随机数必须在[1,9]{4}中。我的第一种方法是将每个随机生成的数字添加到一个集合中,从而避免重复。但在更糟糕的情况下,比如我们已经生成了6个数字,我们必须再生成3个数字,这个过程会有点慢。当范围从[1,9]更改为[1,1000]时,这种方法听起来不正确。有人能提出一个替代方法吗。