Я ожидал 100 пар ключей, но получил шесть. Почему?
(defn random-map-generator [size]
(def theatom (atom {}))
(dotimes [x size]
(swap! theatom assoc
(keyword (nth ["a" "b" "c" "d" "e" "f"] (rand-int 6)))
(rand-int 30)))
@theatom)
(random-map-generator 100)
=> {:f 4, :a 29, :e 15, :c 23, :b 19, :d 28}





Потому что у вас всего 6 уникальных ключей. Как только вы ассоциируете :a там, любая последующая попытка ассоциировать другой :a просто перезаписывает предыдущее значение. Ключевое слово :a идентично другому :a, даже если вы динамически создаете оба.
Кроме того, два несвязанных комментария:
def внутри функций — используйте letreduce, или into + map, или даже loopО Конечно! Уникальные ключи! И побочные моменты очень полезны (относительно использования let против def, избегания атомов. И спасибо также за rand-nth и реальный пример.
Чтобы добавить, есть также
rand-nth, чтобы получить случайный элемент из колл. Оригинал, переписанный сmap, будет:(defn random-map-generator [size] (let [alphabet ["a" "b" "c" "d" "e" "f"]] (->> (repeatedly (fn [] [(keyword (rand-nth alphabet)) (rand-int 6)])) (take size) (into {}))))