如何在 Delphi 2006 中创建一个随机的 64 位整数值?内置的基于整数的 Random() 函数似乎只返回 0 到 2^31 之间的值。
6 回答
你可以使用我的GpRandomGen。它实现了 Marsaglia/Zaman/James 算法,速度极快,据说非常随机。作为免费软件发布。
生成两个 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;
您可以生成 64 个随机位并将结果解释为整数。(如果您使用有符号整数并希望结果为非负数,则为 63 位。)等效地,您可以取 0..2^31-1 范围内的两个随机整数,加上两个额外的随机位,并将它们连接到得到一个随机的 64 位整数。
编辑:我很好奇通过连接伪随机组件生成的伪随机数的统计特性,并发现(显然)这种方法可能无法正常工作,具体取决于您的伪随机生成器(当然对于真正的随机数生成,如来自大气噪声,连接随机位是没有问题的)。对于娱乐用途,各种统计属性的损失可能是可以接受的,但对于更严重的用途,您可能最终需要@gabr 建议的自定义伪随机生成器。这是一个相关的问题:生成具有 256 个随机位的数字的最佳方法?
为了回答我自己的问题,我想出了以下代码:
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。
创建一个 GUID(例如CoCreateGuid)并将其转换为 Int64。
简单的:
function Random64: UInt64;
begin
PCardinal(@result)^ := Random32;
PCardinal(cardinal(@result) + 4)^ := Random32;
end;
Random32
您最喜欢的 32 位无符号整数随机数函数在哪里。