5

如何在 Delphi 2006 中创建一个随机的 64 位整数值?内置的基于整数的 Random() 函数似乎只返回 0 到 2^31 之间的值。

4

6 回答 6

16

你可以使用我的GpRandomGen。它实现了 Marsaglia/Zaman/James 算法,速度极快,据说非常随机。作为免费软件发布。

于 2010-12-10T12:57:52.067 回答
10

生成两个 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;
于 2010-12-10T13:46:41.123 回答
4

您可以生成 64 个随机位并将结果解释为整数。(如果您使用有符号整数并希望结果为非负数,则为 63 位。)等效地,您可以取 0..2^31-1 范围内的两个随机整数,加上两个额外的随机位,并将它们连接到得到一个随机的 64 位整数。

编辑:我很好奇通过连接伪随机组件生成的伪随机数的统计特性,并发现(显然)这种方法可能无法正常工作,具体取决于您的伪随机生成器(当然对于真正的随机数生成,如来自大气噪声,连接随机位是没有问题的)。对于娱乐用途,各种统计属性的损失可能是可以接受的,但对于更严重的用途,您可能最终需要@gabr 建议的自定义伪随机生成器。这是一个相关的问题:生成具有 256 个随机位的数字的最佳方法?

于 2010-12-10T13:03:12.260 回答
4

为了回答我自己的问题,我想出了以下代码:

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 之后创建相同的后续编号 X+1。

于 2010-12-10T13:05:56.267 回答
4

创建一个 GUID(例如CoCreateGuid)并将其转换为 Int64。

于 2010-12-10T16:32:26.007 回答
3

简单的:

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

Random32您最喜欢的 32 位无符号整数随机数函数在哪里。

于 2010-12-10T15:34:09.230 回答