2016-01-12 46 views
2

我有一個項目進行隨機號碼的呼叫,例如生成的所有隨機數(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),我會得到一個空文件。

任何幫助將非常感激。謝謝!

回答

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隨機調用兩次,然後一次沒有任何爭論。