如何在Delphi中获得64位随机值?

时间:2010-12-10 12:54:29

标签: delphi random delphi-2006

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

6 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:10)

生成两个32位的randoms并将它们拼接在一起。

修改

与@ 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;

答案 2 :(得分:4)

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

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

答案 3 :(得分: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.

答案 4 :(得分:4)

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

答案 5 :(得分:3)

简单:

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

其中Random32是您最喜欢的32位无符号整数随机数函数。