老问题了。随机数。有段代码,请大家看看。(100分)

  • 主题发起人 主题发起人 sgwk
  • 开始时间 开始时间
代鱼 提到的分段方法是否可行啊,我的新程序定的就是这种方法,但是还没有测试.
 
在Blog里稍微修改了算法,可以减少分配空间的时间。就不再重贴了。
http://www.delphibbs.com/keylife/iblog_show.asp?xid=21110
试一试。

如果还是不行的话应该的内容太多,造成 SaveToFile 错误。
 
如果单纯生成数字的话。
Uses Math;

procedure SaveRandomNumToFile(aLen: Byte
aCount: Integer
FileName: String);
var
i, M, R: Integer;
S: String;
B: TBits;
F: TextFile;
begin
if not (aLen in [2..10]) then
Exit;
M := Round(IntPower(10, aLen));
if aCount * 2 > M then
Exit;

S := '%.' + IntToStr(aLen) + 'd';
Randomize;
AssignFile(F, FileName);
Rewrite(F);
try
B := TBits.Create;
try
B.Size := M;
for i := 0 to aCount - 1 do
repeat
R := Random(M);
if not B[R] then
begin
B[R] := True;
Writeln(F, Format(S, [R]));
Break;
end;
until False;
finally
B.Free;
end;
finally
CloseFile(F);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const // *%+-*%+-
CountGet: Integer = 50000000
//总数
NumberLen: Byte = 10
//10位数字
begin
Button2.Caption := 'Writing';
SaveRandomNumToFile(NumberLen, CountGet, GetCurrentDir +'/2.Txt');
Button2.Caption := 'OK';
end;
 
问题解决。谢谢各位,特别是jeffrey_s,又快又好啊。
 
试试这种算法怎样:
procedure GetRandomNumList(const ALen, ACount: Integer
VStringList:
TStringList)
overload;
var
Nums: array of integer;
i, m, n, x: integer;
FmtStr: string;
begin
VStringList.Clear;
if (ALen < 2) or (ALen > 10) then
Exit;
SetLength(Nums, ACount);
for i := 1 to ACount do
Nums[i - 1] := i;

Randomize;
for i := 1 to ACount do
begin
m := Random(ACount);
n := Random(ACount);
x := Nums[m];
Nums[m] := Nums[n];
Nums[n] := x;
end;

FmtStr := '%.' + IntToStr(ALen) + 'd';
for i := 0 to ACount - 1 do
VStringList.Add(Format(FmtStr, [Nums]));

end;
 
测一下时间! 字串的长度无限制
{-------------------------------------------------------------------------------
过程名: GetRandomNumList
作者: Kook
日期: 2006.03.31
参数: const ALen: integer (需要输出的字串的长度, 长度无限制)
AOutCount: integer (需要输出的个数)
VStringList: TStringList (输出字串)
返回值: 无
-------------------------------------------------------------------------------}

procedure GetRandomNumList(const ALen: integer
const AOutCount: Integer;
VStringList: TStringList)

var
Nums: array of integer;
m, n, x, Loop, Len: integer;
i, j, MaxNum: integer;
FmtStr: string;
begin
if ALen > 5 then
begin
Loop := ALen div 5;
for j := 1 to Loop do
GetRandomNumList(5, AOutCount, VStringList);

Len := ALen mod 5;
GetRandomNumList(Len, AOutCount, VStringList);
Exit;
end
else
if ALen < 1 then
Exit;

FmtStr := '%.' + IntToStr(ALen) + 'd';
MaxNum := StrToInt('1' + Format(FmtStr, [0]));

SetLength(Nums, MaxNum);

for i := 0 to MaxNum - 1 do
Nums := i;

Randomize;
for i := 1 to MaxNum do
begin
m := Random(MaxNum);
n := Random(MaxNum);
x := Nums[m];
Nums[m] := Nums[n];
Nums[n] := x;
end;

FmtStr := '%.' + IntToStr(ALen) + 'd';
if VStringList.Count = 0 then
begin
for i := AOutCount - 1 downto 0 do
VStringList.Add(Format(FmtStr, [Nums]));
end
else
begin
for i := AOutCount - 1 downto 0 do
VStringList := Format(FmtStr, [Nums]) + VStringList;
end;
end;
 

Similar threads

I
回复
0
查看
503
import
I
I
回复
0
查看
687
import
I
I
回复
0
查看
531
import
I
I
回复
0
查看
577
import
I
后退
顶部