Random 保存程序生成的所有随机数,然后在racket中重用它们

Random 保存程序生成的所有随机数,然后在racket中重用它们,random,input,racket,Random,Input,Racket,我有一个项目打电话给随机号码,例如: 我有这样的调用:(随机)生成0到1之间的数字,也有这样的调用:(随机n),生成范围内的数字 我想做的是把整个程序中生成的所有随机数放在一个文件中 我有以下代码: (require (rename-in racket [random random0])) (define random-port (open-output-file "random-numbers.rktl" #:exists 'replace)) (define (random x

我有一个项目打电话给随机号码,例如:

我有这样的调用:
(随机)
生成0到1之间的数字,也有这样的调用:
(随机n)
,生成范围内的数字

我想做的是把整个程序中生成的所有随机数放在一个文件中

我有以下代码:

  (require (rename-in racket [random random0]))

  (define random-port (open-output-file "random-numbers.rktl" #:exists 'replace))
  (define (random x)
    (define y (random0 x))
    (displayln y random-port)
    y)
但这不仅仅适用于(
random
),而是适用于(
random n
)。有没有办法让这两种方法都奏效

第二,如果我有多个使用
random
的模块,我可以把这些代码放在哪里

最后,出于某种原因,当我写这样的东西时:

  (for ([i (in-range 100000)]) (random 10))
文件中显示的数字没有问题

但是当我写这个:
(随机10)
,我会得到一个空文件


任何帮助都将不胜感激。谢谢大家!

听起来你遇到了很多问题,然后我有一些一般性的建议

第一:你说它不适用于
(随机)
。如果我理解正确,您希望能够定义一个可以用一个或零个参数调用的函数。有多种方法可以做到这一点,但最简单的方法可能是使用可选参数:

#lang racket

(define (my-random [limit #f])
  (cond [limit (random limit)]
        [else (random)]))

(my-random 13)
(random)
接下来,您将讨论如何在调用
(随机10)
时获得一个空文件。我强烈怀疑问题在于您没有关闭输出端口,这是刷新输出所必需的。您可以调用
(关闭输出端口随机端口)
(尽管
随机端口
不是这个变量的好名字…)

不过,接下来,我有两个建议是您没有要求的:)

首先,我不会重命名
random
函数;相反,我只想用一个新名称定义我自己的函数,就像我上面所做的那样。如果问题是您有一堆使用
random
的现有代码,那么您可以在导入时进行重命名

第二,更重要的是:处理这个问题的标准方法(我想看看生成的随机数)不是记录所有生成的数字,而是使用一个已知的种子来生成随机数。因此,例如,如果您调用
(随机种子277819)
,您将始终得到相同的随机数序列。使用
随机种子
,您不需要存储随机数的完整列表,只需要存储初始种子

这种美中不足之处在于,您确实需要知道
random
的参数。例如,你需要知道,你用参数14调用了两次random,然后没有任何参数调用了一次