2013-11-09 2 views
0

в ракетке, как я могу выбрать место в хэш-таблице, основанной на номере? как у меня есть хеш-таблица, и я хочу случайным образом выбирать вещи из него, поэтому я собираюсь использовать размер хэш-таблицы случайным образом, чтобы выбрать число в этом диапазоне, чтобы выбрать запись в хеш-таблице.Выбор места в хэш-таблице RACKET

ответ

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)) 
0

Вы не можете использовать хеш-таблицу напрямую, вам нужно использовать структуру, которая индексируется последовательными целыми числами.

В зависимости от вашей хэш-таблицы, нужно ли сохранить оригинальные ключи в результате, и ваше исполнение потребностей вы можете использовать либо hash-keys, hash-values, hash->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))))) 

hash-> Список

(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))))) 
Смежные вопросы