Как отфильтровать генератор случайных чисел и не включать 0 - PullRequest
0 голосов
/ 08 февраля 2019

Как исправить ошибку random: expects (or/c (integer-in 1 4294967087) pseudo-random-generator?) or a pseudo-random-generator, given 0?

(require 2htdp/universe)
(require 2htdp/image)

(define-struct sample(x))
(define BACKGROUND (empty-scene 100 100))
(define CIRCLE (ellipse 10 10 "solid" "red"))

(define (rand d)
  (random d))

(define (randoll d)
  (cond [(even? (rand d))(rand d)]
        [(< (rand d) 6)7]
        [(= (rand d) 0)7]
        [else 7]))

(define (main ws)
  (big-bang ws
      (on-tick randoll)
      (to-draw render)))

(define (render d)
      (place-image CIRCLE (randoll d) 6 BACKGROUND))

(основной 100) случайный: ожидает (или / c (целое число в 1 4294967087) псевдослучайный генератор?)или псевдослучайный генератор, заданный 0

Ожидал, что он будет постоянно менять места на четных числах, но это случилось

1 Ответ

0 голосов
/ 08 февраля 2019

Как насчет добавления 1 к параметру, переданному random?до тех пор, пока введено значение >= 0, оно будет работать нормально - полученная вами ошибка просто говорит о том, что вы не можете передать 0 в качестве параметра random:

(define (rand d)
  (random (+ d 1)))

ByКстати, randoll выглядит не так.Почему вы проверяете, является ли случайное значение четным, просто чтобы вернуть другое случайное значение, которое мы не знаем, будет ли оно четным?И кажется, что если случайное значение равно нулю или во всех других случаях вы просто хотите вернуть 7.Лучше попробуйте это, если оно соответствует вашим ожиданиям:

(define (randoll d)
  (let ([r (rand d)])   ; call `rand` exactly once
    (cond [(zero? r) 7] ; 0 is even, so check this first
          [(even? r) r] ; return `r` only if it's even
          [else 7])))   ; default case

Я не уверен, каков ожидаемый диапазон значений для randoll, но мне кажется, что большую часть времени это будет простовозврат 7.Это то, что вы хотите?

...