保存程序生成的所有随机数,然后在球拍中重复使用它们

时间:2016-01-12 18:06:43

标签: random input racket

我有一个项目调用随机数,例如:

我的调用看起来像这样:(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)时,我会得到一个空文件。

任何帮助都将非常感激。谢谢!

1 个答案:

答案 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调用了两次随机,然后一次没有任何参数。