そのままでは、random
再帰的に再度呼び出していないため、プロシージャは 1 回だけ呼び出されますinput_stream
。これが、ストリーム内のすべての乱数が実際には同じ数である理由です。新しい値が作成されるたびに疑似乱数ジェネレーターが呼び出されることを保証する必要がありますcons
。たとえば、次のようになります。
(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))
たとえば、最初の 3 つの要素にアクセスするには、次のようにします。
(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