0

在球拍中,如何根据数字在哈希表中选择一个位置?因为我有一个哈希表,我想从中随机选择一些东西,所以我要使用哈希表的大小随机选择该范围内的一个数字来选择哈希表中的一个条目。

4

2 回答 2

0
(random n) 

返回 0 到 n-1 范围内的整数。因此,您可以执行以下操作

  (define ht (hash 0 'red 1 'yellow 2 'blue))
  (hash-ref ht (random 3))

但是您需要小心以下示例可能会失败。

  (define ht2 (hash 0 'red 1 'yellow 3 'blue))
  (hash-ref ht2 (random 4))
于 2013-11-09T04:07:23.440 回答
0

您不能直接使用哈希表,您需要使用可通过连续整数索引的结构。

根据您的哈希表,您是否需要在结果中保留原始键,以及您的性能需求,您可以使用hash-keys, hash-valueshash->list或者您可以创建一个新的哈希,用连续整数替换所有键:

例子:

哈希键

(define (take-hash-random1 h n)
  (let* ((keys (hash-keys h)) (len (length keys)))
    (for/list ((i (in-range n)))
      (hash-ref h (list-ref keys (random len))))))

(take-hash-random1 ht 5)
=> '(yellow yellow red yellow yellow)

哈希值

(define (take-hash-random2 h n)
  (let* ((vals (hash-values h)) (len (length vals)))
    (for/list ((i (in-range n)))
      (list-ref vals (random len)))))

哈希->列表

(define (take-hash-random3 h n)
  (let* ((lst (hash->list h)) (len (length lst)))
    (for/list ((i (in-range n)))
      (cdr (list-ref lst (random len))))))

新的哈希表

(define (take-hash-random4 h n)
  (let* ((vals (hash-values h)) 
         (len (length vals))
         (newh (make-hash (map cons (range len) vals))))
    (for/list ((i (in-range n)))
      (hash-ref newh (random len)))))
于 2013-11-09T07:32:44.723 回答