我有一个项目调用随机数,例如:
我的调用看起来像这样:(random)
生成0到1之间的数字,也是这样调用:(random 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))
数字在文件中显示没有问题,
但是当我写这个:(random 10)
时,我会得到一个空文件。
任何帮助都将非常感激。谢谢!
答案 0 :(得分:5)
听起来你遇到了很多问题,然后我有一些一般的建议。
首先:你说它不适用于(random)
。如果我理解正确,您希望能够定义一个可以使用一个或零参数调用的函数。有很多方法可以做到这一点,但最简单的方法可能是使用可选参数:
#lang racket
(define (my-random [limit #f])
(cond [limit (random limit)]
[else (random)]))
(my-random 13)
(random)
接下来,您将谈谈在致电(random 10)
时如何获取空文件。我强烈怀疑问题是你没有关闭输出端口,这是为了刷新输出所必需的。你可以致电(close-output-port random-port)
(虽然random-port
不是这个变量的好名字......)。
接下来,我有两个你没有要求的建议:)。
首先,我不会重命名random
函数;相反,我会用一个新名称定义我自己的函数,就像我上面所做的那样。如果问题是您有一堆使用random
的现有代码,那么您可以在导入时重命名。
第二,甚至更大:处理这个问题的标准方法(我希望看到生成的随机数)不是记录所有生成的数字,而只是为随机使用已知的种子数字生成。因此,例如,如果您致电(random-seed 277819)
,您将始终获得相同的随机数序列。使用random-seed
,您不需要存储随机数的完整列表,只需存储初始种子。
这个软膏中唯一的一点就是你需要知道random
的论据。所以,例如,你需要知道你用参数14调用了两次随机,然后一次没有任何参数。