Выберите случайную запись из мнезии - PullRequest
3 голосов
/ 01 июня 2011

У меня есть таблица мнезий t, которая содержит записи с одним полем x. Как выбрать случайное значение x из t?

Чтобы избежать всего процесса математической педантичности: меня не волнуют детали генерации случайных чисел, я просто хочу, чтобы мой результат обычно не был одинаковым каждый раз.

Спасибо,
-tjw

Ответы [ 2 ]

5 голосов
/ 01 июня 2011

не очень эффективно, но будет работать:

  1. сгенерировать случайное целое число X
  2. получить размер таблицы
  3. получить указатель с использованием мнезии: first
  4. итерация X раз в случайную запись
  5. поиск записи

более сложный:

  1. создать дополнительное поле, содержащее целое число
  2. целое число увеличивается накогда-либо установить
  3. создать индекс над дополнительным полем
  4. случайное число X
  5. грязное чтение индексированной строки с X в качестве ключа

еще один:

  1. использование int в качестве первичного ключа
  2. random int
  3. извлечение строки

Каждое из этих решений имеет важные недостатки: производительность одновременной записи, читать накладные и т. д.

4 голосов
/ 01 июня 2011

Используя функцию mnesia:all_keys/1 (или грязный эквивалент) и модуль random.

random_value(Table) ->
    Keys = mnesia:dirty_all_keys(Table),
    Key = lists:nth(random:uniform(length(Keys)), Keys),
    [#record{x = X}] = mnesia:dirty_read({Table, Key}),
    X.

Не забудьте инициализировать семена с помощью random:seed/3.

...