Как получить 64-битное случайное значение в Delphi? - PullRequest
5 голосов
/ 10 декабря 2010

Как создать случайное 64-разрядное целое число в Delphi 2006?Кажется, встроенная целочисленная функция Random () возвращает только значения от 0 до 2 ^ 31.

Ответы [ 6 ]

16 голосов
/ 10 декабря 2010

Вы можете использовать мой GpRandomGen .Он реализует алгоритм Marsaglia / Zaman / James, он очень быстрый и предположительно очень случайный.Выпущено как бесплатное программное обеспечение.

10 голосов
/ 10 декабря 2010

Создайте два 32-битных рандома и соедините их вместе.

РЕДАКТИРОВАТЬ

Подобно ответу @ Andreas, мне нравится следующая (эквивалентная) реализация:

function Random64: UInt64;
var
  Overlay: packed record
    a, b: UInt32;
  end absolute Result;
begin
  Assert(SizeOf(Overlay)=SizeOf(Result));
  Overlay.a := Random32;
  Overlay.b := Random32;
end;
4 голосов
/ 10 декабря 2010

Создайте GUID (например, CoCreateGuid ) и приведите его к Int64.

4 голосов
/ 10 декабря 2010

Чтобы ответить на свой вопрос, я набрал следующий код:

function GetRandomInt64() : int64;
begin
   Int64Rec(result).Words[0] := Random(High(Word));
   Int64Rec(result).Words[1] := Random(High(Word));
   Int64Rec(result).Words[2] := Random(High(Word));
   Int64Rec(result).Words[3] := Random(High(Word));
end;

Не уверен, является ли это допустимым решением или оно всегда будет создавать один и тот же последующий номер X + 1 после заданного номера результата X.

4 голосов
/ 10 декабря 2010

Вы можете сгенерировать 64 случайных бита и интерпретировать результат как целое число. (63 бита, если вы работаете со целыми числами со знаком и хотите, чтобы результат был неотрицательным.) Эквивалентно, вы можете взять два случайных целых числа в диапазоне 0..2 ^ 31-1, плюс два дополнительных случайных бита и объединить их в получить случайное 64-битное целое число.

РЕДАКТИРОВАТЬ: Мне было любопытно о статистических свойствах псевдослучайных чисел, генерируемых путем объединения псевдослучайных компонентов, и обнаружил, что (по-видимому) этот подход может не работать хорошо в зависимости от вашего псевдослучайного генератора ( конечно, для генерации истинных случайных чисел, из-за атмосферного шума, конкатенация случайных битов не является проблемой). Для развлекательного использования потеря различных статистических свойств может быть приемлемой, но для более серьезного использования вам может понадобиться специальный генератор псевдослучайных данных, как предложено @gabr. Вот связанный вопрос: Лучший метод генерации числа с 256 случайными битами?

3 голосов
/ 10 декабря 2010

Простой:

function Random64: UInt64;
begin
  PCardinal(@result)^ := Random32;
  PCardinal(cardinal(@result) + 4)^ := Random32;
end;

, где Random32 - ваша любимая 32-битная функция случайных чисел без знака.

...