Erlang - Случайное число gen с Makeref - PullRequest
5 голосов
/ 10 февраля 2011

Я пытаюсь сгенерировать достаточно случайное число быстро.

Прямо сейчас я использую следующее:

uniqueID() ->   C = random:uniform(9999) ,   %%%DO SPEED TEST
    random:seed(C,random:uniform(99),random:uniform(99)),
    {_, {H, Min, S}}  = calendar:universal_time(),
    {A, B} = statistics(wall_clock),
    (A*B) +((H + C + Min) * S).

Это занимает слишком много времени по сравнению с чем-то вроде make_ref ().

6> make_ref().
#Ref<0.0.0.74>

Как взять уникальный код и разобрать его, чтобы он стал целым числом?

, например, 00074

Спасибо за помощь.

Ответы [ 3 ]

8 голосов
/ 10 февраля 2011

Вы действительно уверены, что хотите использовать erlang:make_ref/0 для уникальных номеров? Ссылки уникальны только для одного запуска одного erlang vm - они повторяемы, предсказуемы и создают паршивые уникальные идентификаторы, если вы планируете использовать их для чего-либо, кроме тегов в сообщениях erlang для сопоставления запросов и ответов.

Вы можете сделать это, отформатировав ссылку как строку (erlang:ref_to_list/1), а затем проанализировав ее.

Тем не менее, я думаю, что лучше всего было бы использовать crypto:rand_bytes/1, чтобы получить двоичный файл N случайных байтов, или crypto:rand_uniform/2, если вам нужно случайное целое число в некотором диапазоне. По крайней мере, этот метод дает вам некоторые гарантии относительно качества случайных целых чисел, которые вы производите (см. Документацию openssl rand_bytes ).

1 голос
/ 11 февраля 2011

{A, B, C} = сейчас (), A * 1000000000000 + B * 1000000 + C.

0 голосов
/ 17 июля 2015

В версии 18.0 Erlang / OTP это поддерживается "из коробки", используя erlang:unique_integer/{0,1}.

При вызове без параметров он возвращает уникальные значения, а с модификаторами - строго монотонные результаты, хотя эти вызовы стоят дороже.

erlang: unique_integer () -> integer ()
erlang: unique_integer (ModList) -> integer () Modlist = [Модификатор]
Модификатор = положительный | монотонная

Генерирует и возвращает уникальное целое число в текущей среде выполнения. Экземпляр . Целое число уникально в том смысле, что этот BIF, используя один и тот же набор модификаторов, не вернет одно и то же целое число больше, чем один раз на текущем экземпляре системы времени выполнения. Каждое целое значение может Конечно, будет построен другими средствами.

Действующие в настоящее время модификаторы:

положительный
Вернуть только натуральные числа.

монотонна
Возврат строго монотонно увеличение целых чисел, соответствующих времени создания.

Поскольку erlang:now/0 устарел, предлагается реализовать несколько вещей с erlang:unique_integer/{0,1}.

...