Схема: R5RS :: Сделать десятизначное место стоимости - PullRequest
0 голосов
/ 04 марта 2020
(define m (expt 2 32))
(define a 22695477)
(define c 1.0)

(define (integers-starting-from n)
    (stream-cons n (integers-starting-from (+ n 1))))

(define (prng seed)
  (define xn (remainder (+ c (* a seed)) m))
  (define prn (/ (remainder (+ c (* a seed)) m) m))
  (stream-cons prn
               (prng xn)))

Когда я запускаю этот код, мой текущий вывод равен

(stream->list (prng 3) 5)
> (0.015852607786655426 0.4954120593611151 0.998752823099494 0.7253396362066269 0.03071586787700653)

Но вывод должен быть

(stream->list (prng 3) 5)
> (0.01585 0.4954 0.9988 0.7253 0.0307)

Как сделать вывод с десятизначным разрядным значением?

1 Ответ

1 голос
/ 04 марта 2020

Вот один способ, если вы используете ракетку:

(define (prng seed)
  (define xn (remainder (+ c (* a seed)) m))
  (define prn (/ (remainder (+ c (* a seed)) m) m))
  (stream-cons (truncate prn 4)
               (prng xn)))

(define (truncate num precision)
  (string->number (~r num #:precision precision)))

Теперь вывод будет:

'(0.0159 0.4954 0.9988 0.7253 0.0307)
...