Vector 向量内的随机数生成

Vector 向量内的随机数生成,vector,scheme,random,Vector,Scheme,Random,在scheme下,我想生成一个随机数向量,我试过这样做: (make-vector 10 (random 100)) (define (build-vector n f) (let ((v (make-vector n))) (do ((i 0 (+ i 1))) ((> i 9) v) (vector-set! v i (f i))))) 这个的输出是这样的: #(44 44 44 44 44 44 44 44 44 44) 所以它似乎对生成的项目使用了相同

在scheme下,我想生成一个随机数向量,我试过这样做:

(make-vector 10 (random 100))
(define (build-vector n f)
  (let ((v (make-vector n)))
    (do ((i 0 (+ i 1))) ((> i 9) v)
      (vector-set! v i (f i)))))
这个的输出是这样的:

#(44 44 44 44 44 44 44 44 44 44)
所以它似乎对生成的项目使用了相同的种子,如何克服生成n个随机生成的数字序列的问题


干杯

您需要为向量的每个元素调用一次
random 100

您需要为向量的每个元素调用一次
random 100

如果您使用PLT方案,您可以使用构建向量:

(build-vector 100 (lambda (_) (random 100)))
如果您使用的是标准化版本(R5R、R6R等),您可以自己定义构建向量,例如:

(make-vector 10 (random 100))
(define (build-vector n f)
  (let ((v (make-vector n)))
    (do ((i 0 (+ i 1))) ((> i 9) v)
      (vector-set! v i (f i)))))

如果您使用PLT方案,您可以使用构建向量:

(build-vector 100 (lambda (_) (random 100)))
如果您使用的是标准化版本(R5R、R6R等),您可以自己定义构建向量,例如:

(make-vector 10 (random 100))
(define (build-vector n f)
  (let ((v (make-vector n)))
    (do ((i 0 (+ i 1))) ((> i 9) v)
      (vector-set! v i (f i)))))
另一种方法是:

  (define (random-vector count seed)
    (let loop ((vec '(vector)) (i count))
      (cond ((> i 0)
          (loop (cons (random seed) vec) (sub1 i)))
         (else (eval (reverse vec))))))
可能不是最佳解决方案,但演示了如何在运行时编写和评估Scheme程序。也许对新的阴谋家有用

一些示例用法:

> (random-vector 10 100)
#10(53 57 47 34 88 32 70 66 92 56)

> (random-vector 100 500)
#100(42 1 250 396 63 120 185 397 251 88 497 271 246 327 91 108 240 306 445 180 292 55 497 67 445 300 279 229 342 122 498 10 253 248 44 133 450 55 112 13 309 255 101 456 272 7 239 113 394 453 89 343 386 471 92 44 61 239 382 313 78 22 376 466 24 97 286 343 237 220 458 153 131 217 390 94 53 461 237 22 327 196 460 436 311 418 41 124 79 24 37 388 344 176 314 432 26 341 303 218)
另一种方法是:

  (define (random-vector count seed)
    (let loop ((vec '(vector)) (i count))
      (cond ((> i 0)
          (loop (cons (random seed) vec) (sub1 i)))
         (else (eval (reverse vec))))))
可能不是最佳解决方案,但演示了如何在运行时编写和评估Scheme程序。也许对新的阴谋家有用

一些示例用法:

> (random-vector 10 100)
#10(53 57 47 34 88 32 70 66 92 56)

> (random-vector 100 500)
#100(42 1 250 396 63 120 185 397 251 88 497 271 246 327 91 108 240 306 445 180 292 55 497 67 445 300 279 229 342 122 498 10 253 248 44 133 450 55 112 13 309 255 101 456 272 7 239 113 394 453 89 343 386 471 92 44 61 239 382 313 78 22 376 466 24 97 286 343 237 220 458 153 131 217 390 94 53 461 237 22 327 196 460 436 311 418 41 124 79 24 37 388 344 176 314 432 26 341 303 218)

就我所见,make vector对我来说是毫无用处的。@Hellnar:不,你仍然需要make vector首先生成一个向量,然后你设置每个元素。就我所见,make vector对我来说是毫无用处的。@Hellnar:不,你仍然需要make vector首先生成一个向量,然后你设置每个元素。谢谢,我可以问你“lambda(u)”是什么意思吗?谢谢,我只是把一个下划线作为变量名,因为我从来没有在函数体中使用过它。非常感谢,我可以问一下“lambda(_)”的含义吗?thanksI只是将下划线作为变量名,因为我从未在函数体中使用过它。