从this question中,我们可以从两个长度不同的列表中构造一个交错列表(根据Sylwester使用 circular-list 的答案)。我的问题是,我们如何才能做到这一点,但要随机抽取第二个列表中的元素。
也就是说,我想为列表中的元素分配列表中的随机值。例如:给定分配列表'(0 1)和任何列表'(abcd),我想要作为输出的列表为'((a 0)(b 0)(c 1)( d 0))或'((例如((a 1)(b 0)(c 0)(d 1))。
我的尝试是:
(map cons'(a b c d)(循环列表(随机'(0 1))))
给出'((a.0)(b.0)(c.0)(d.0))或'((a.1)(b.1)(c.1)(d.1 )),没什么不同
(map cons'(a b c d)(list(random'(0 1))))
给出'(((a。0))或'((a。1))),没有什么不同。
PS:我正在使用一个名为 random 的函数,并将其定义为
(define(random lst)(list-ref lst(random(length lst))))
在我的示例中,它将从列表'(0 1)中随机抽取0或1。
答案 0 :(得分:2)
为避免混淆,应将列表上的新“ random
”功能重命名为random-element
或类似名称。这样,阅读您的代码的所有人和Racket都会知道其中的区别。
random : PositiveNaturalNumber -> NaturalNumber
random-element : [NonEmptyListof X] -> X
这两个不同的函数需要具有两个不同的名称,以便当您想要引用Racket中的第一个random
时,可以这样做。否则,Racket(以及其他阅读您代码的人)会在您真正想要random-element
时认为您的意思是random
。
这种混淆在您对“ random
”的定义中很重要:
; /--------------<< This should be renamed to `random-element`
; \/
(define (random lst)
(list-ref lst (random (length lst))))
; /\
; \------<< This is meant to be the original Racket `random`
; but it ends up referring to "random-element" because
; of the naming conflict
由于该名称冲突,将random
的定义放入 File 中,并且对该文件运行Repl时,会出现如下错误:
> (random '(A B C D E F G))
length: contract violation
expected: list?
given: 7
重命名后,定义应如下所示:
;; random-element : [NonEmptyListof X] -> X
(define (random-element lst)
(list-ref lst (random (length lst))))
; /\
; \-------<< This is the `random` from Racket, not the "new" one
使用它:
> (random-element '(A B C D E F G))
'E
> (random-element '(A B C D E F G))
'B
> (random-element '(A B C D E F G))
'D
> (random-element '(A B C D E F G))
'F
> (random-element '(A B C D E F G))
'C
答案 1 :(得分:0)
注释不能包含代码片段,所以...
该程序提供什么?
#lang racket
(require srfi/1)
(random '(0) '(1))
在装有Racket 7.0的计算机上,我得到:
random: contract violation
expected: exact-integer?
given: '(0)
argument position: 1st
other arguments...: