首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi - TRandomStream TurboPower LockBox 3的问题

Delphi - TRandomStream TurboPower LockBox 3的问题
EN

Stack Overflow用户
提问于 2011-09-24 03:48:25
回答 1查看 378关注 0票数 2

我使用的是TurboPower LockBox 3 (http://sourceforge.net/projects/tplockbox/http://lockbox.seanbdurkin.id.au/tiki-index.php)

我对TRandomStream有点问题。我试图生成一个32字节的随机数据块,但输出似乎不是随机的。

代码是:

代码语言:javascript
复制
function StringToHex(S: String): String;
var I: Integer;
begin
  Result:= '';
  for I := 1 to length (S) do
    Result:= Result+IntToHex(ord(S[i]),2)+' ';
end;

procedure TForm1.btn1Click(Sender: TObject);
const
  Len = 32;
var
  j,k: Integer;
  P: Pointer;
  Str: AnsiString;
begin
  GetMem(P,Len);
  TRandomStream.Instance.Randomize;
  SetLength(Str,Len);
  for j := 1 to 20 do
  begin
    TRandomStream.Instance.Read(P^,Len);
    for k := 0 to Len-1 do
    begin
      Str[k+1]:=PAnsiChar(P)[k];
    end;
    mmoOutput.Lines.Add('> '+StringToHex(Str));
  end;
  FreeMem(P,Len);
end;

输出为:

代码语言:javascript
复制
> 91 79 00 77 FD F7 1C 51 22 64 BA 07 9F 87 8F B2 85 94 92 84 6B F7 5B 55 1A 0D DE E5 44 4A 56 DA 
> A5 A6 C3 3D DB 01 69 61 5A 66 D8 ED 3F 3B 4D 00 A5 D7 CB 84 BB 40 CE 3E 5A 90 54 DD BF 63 0E 2C 
> A5 5F 75 70 76 1F 08 25 5A E0 8D F0 9C 0B 15 F7 A5 9F C1 A7 F9 7C FF BA 5A 60 58 60 B5 97 F4 25 
> A5 9F 23 E2 09 D2 74 52 5A 60 AC 5E 6E D8 B6 81 A5 9F 33 B5 2B B8 B5 15 5A 60 4C 51 96 DB 68 66 
> A5 9F B3 4D 3A 51 4C 0D 5A 60 4C E6 D5 4C F8 83 A5 9F B3 11 AF 19 DB 2D 5A 60 4C 8E D2 D6 49 70 
> A5 9F B3 31 55 5D D1 28 5A 60 4C CE B7 26 56 C8 A5 9F B3 31 86 7A 83 A0 5A 60 4C CE E1 A5 B8 E8 
> A5 9F B3 31 0E 64 14 5E 5A 60 4C CE 31 9F CC EB A5 9F B3 31 4E B0 9B 4A 5A 60 4C CE B1 69 6C 04 
> A5 9F B3 31 4E 12 D6 AE 5A 60 4C CE B1 BD 6A C9 A5 9F B3 31 4E 22 A9 D0 5A 60 4C CE B1 5D 5D F1 
> A5 9F B3 31 4E A2 41 DF 5A 60 4C CE B1 5D F2 30 A5 9F B3 31 4E A2 05 54 5A 60 4C CE B1 5D 9A 2D 
> A5 9F B3 31 4E A2 25 FA 5A 60 4C CE B1 5D DA 12 A5 9F B3 31 4E A2 25 2B 5A 60 4C CE B1 5D DA 3C 
> A5 9F B3 31 4E A2 25 B3 5A 60 4C CE B1 5D DA 8C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C 
> A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C A5 9F B3 31 4E A2 25 F3 5A 60 4C CE B1 5D DA 0C

这似乎不是随机的。

我做错了什么?

谢谢并致以问候。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-02 07:40:58

好的。我已经找到了问题所在并解决了问题。Procedure TRandomStream.Crunch使用编译器版本切换:

对于编译器版本> 17

代码语言:javascript
复制
FValue := FValue * Factor + 1 ;

而对于编译器版本<= 17 (这是我的例子),函数SquarePlus1Int64_NoOverflowChecks的使用等同于:

代码语言:javascript
复制
FValue := FValue * FValue + 1; 

要修复更改,请执行以下操作:

代码语言:javascript
复制
function SquarePlus1Int64_NoOverflowChecks(Factor: int64): int64;
begin
  result := Factor * Factor + 1
end;

代码语言:javascript
复制
function MultiplyPlus1Int64_NoOverflowChecks(Value,Factor: int64): int64;
begin
  result := Value * Factor + 1
end;

在TRandomStream.Crunch change中:

代码语言:javascript
复制
FValue := SquarePlus1Int64_NoOverflowChecks(FValue);

代码语言:javascript
复制
FValue := MultiplyPlus1Int64_NoOverflowChecks(FValue, Factor);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7534060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档