事实上,该random
过程只被调用一次,因为您没有input_stream
再次递归调用,这就是为什么流中的所有随机数实际上都是相同的数字。您必须保证每次cons
'ed 新值时都会调用伪随机数生成器,例如:
(define (random-stream n)
(cons (random n) (delay (random-stream n))))
现在这个流将包含 0-9 范围内的随机数:
(define input_stream (random-stream 10))
注意:我定义n
了一个参数 jut 以使生成的流可参数化,它可以与固定值一样工作:
(define (random-stream)
(cons (random 10) (delay (random-stream))))
(define input_stream (random-stream))
例如,要访问前三个元素:
(car input_stream)
=> 9 ; random number between 0-9
(car (force (cdr input_stream)))
=> 7 ; random number between 0-9
(car (force (cdr (force (cdr input_stream)))))
=> 8 ; random number between 0-9
或者一般来说,用于生成m
从 0(包括)到(不包括)的随机元素列表n
:
(define (stream-take s m)
(if (zero? m)
'()
(cons (car s)
(stream-take (force (cdr s)) (sub1 m)))))
(stream-take (random-stream 10) 20) ; n=10, m=20
=> '(3 3 3 7 0 7 3 2 3 7 6 0 6 4 1 4 6 1 6 9) ; 20 random numbers between 0-9