gpt4 book ai didi

将 XORShift 算法从 C 代码转换为 Delphi 代码

转载 作者:行者123 更新时间:2023-11-30 21:09:52 26 4
gpt4 key购买 nike

我有 C 代码,我想将其转换为 Delphi。我所做的到底是对还是错?

uint64_t s[ 16 ];
int p;

uint64_t next(void) {
uint64_t s0 = s[ p ];
uint64_t s1 = s[ p = ( p + 1 ) & 15 ];
s1 ^= s1 << 31; // a
s1 ^= s1 >> 11; // b
s0 ^= s0 >> 30; // c
return ( s[ p ] = s0 ^ s1 ) * 1181783497276652981LL;

德尔福代码:

Function next() : UInt64;
var
s : array of UInt64;
s0, s1 : UInt64;
p : integer;
begin
SetLength(s, 16);
s0 := s[p];
p := ( p + 1 ) and 15;
s1 := s[p];
s1 := s1 xor (s1 shl 31);
s1 := s1 xor (s1 shr 11);
s0 := s0 xor (s0 shr 30);
s[p] := (s0 xor s1) * 1181783497276652981;
result := s[p];
end;

最佳答案

您的翻译在很多方面都是错误的。除此之外,您的 Delphi 代码无法编译,实际上 C 代码也无法编译。

函数的结尾应该是:

s[p] := s0 xor s1;
Result := s[p] * 1181783497276652981;

这里使用堆分配的数组是浪费的。请改用固定长度数组。

我看到的另一个问题是 sp 在 C 代码中的范围比 Delphi 代码的范围更广。我们无法看到它们是如何在 C 代码中初始化的,因为不幸的是您删除了许多重要的代码。但显然,您的 Delphi 代码无法处理这种差异。在 C 代码中,s 意味着在不同的调用之间保持不变。同样的p

也许代码应该是:

var 
s: array [0..15] of UInt64;
p: Integer;

function next() : UInt64;
var
s0, s1 : UInt64;
begin
s0 := s[p];
p := ( p + 1 ) and 15;
s1 := s[p];
s1 := s1 xor (s1 shl 31);
s1 := s1 xor (s1 shr 11);
s0 := s0 xor (s0 shr 30);
s[p] := s0 xor s1;
Result := s[p] * 1181783497276652981;
end;

但同样,我们不知道 sp 是如何初始化的。你是吗?

您需要做的是一些测试。比较两个程序的输出。如果他们同意,那就太好了。如果不匹配,请调试 Delphi 程序以找出差异所在。

关于将 XORShift 算法从 C 代码转换为 Delphi 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33065656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com