为列表的元素分配随机值

时间:2019-01-03 09:56:18

标签: list random racket

this question中,我们可以从两个长度不同的列表中构造一个交错列表(根据Sylwester使用 circular-list 的答案)。我的问题是,我们如何才能做到这一点,但要随机抽取第二个列表中的元素。

也就是说,我想为列表中的元素分配列表中的随机值。例如:给定分配列表'(0 1)和任何列表'(abcd),我想要作为输出的列表为'((a 0)(b 0)(c 1)( d 0))或'((例如((a 1)(b 0)(c 0)(d 1))。

我的尝试是:

  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 )),没什么不同

  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。

2 个答案:

答案 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...: