谁能给一段从intFrom到intTo连续整数当中,选出number个不重复的数的算法,或者看看下面这段代码怎么调通:(偶着急用的)多谢!!! (50分)

  • 主题发起人 视觉音乐
  • 开始时间

视觉音乐

Unregistered / Unconfirmed
GUEST, unregistred user!
从intFrom到intTo连续整数当中,选出number个不重复的:
procedure RandomX(intFrom,intTo,number:Integer;
N:array of Integer);
var
Temp : Integer;
i,j : Integer;
Exist : Boolean;
begin
if Number>(intTo-intFrom) then
Raise Exception.Create('无法生成。');
SetLength(N,number);
N[0]:=-1;
for i:=1 to Number do
begin
Exist:=False;
repeat
Temp:=Random(intTo-intFrom)+intFrom;
for j:=0 to i-1 do
if Temp=N[j] then
begin
Exist:=True;
Break;
end;
until not Exist;
N[i-1]:=Temp;
end;
end;

procedure RandomX(intFrom,intTo,number:Integer;
var N:array of Integer);
同样提示错误,SetLength(N,number)提示类型不匹配。
 
RandomX(1,10,3;[1,2,3]);
 
procedure RandomX(intFrom,intTo,number:Integer;
var N:array of Integer);
 
procedure RandomX(intFrom,intTo,number:Integer;
var N:array of Integer);
同样提示错误,SetLength(N,number)提示类型不匹配。
 
var
intFrom,intTo,number:Integer;
N:array of Integer;
begin
intFrom:=0;
intTo:=0;
number:=0;
SetLength(N,1);
N[0]:=0;
RandomX(intFrom,intTo,number,N);
end;
 
txxxx=array of Integer;
procedure RandomX(intFrom,intTo,number:Integer;
N:txxxx);
 
先声明
N:array of Integer;
再传入procedure RandomX(intFrom,intTo,number,N);
 
type
TSomeArrayElement = integer;
PSomeArray = ^TSomeArray;
TSomeArray = array of TSomeArrayElement;
procedure CreateArray(var TheArray : PSomeArray;
NumElements : longint);
begin
GetMem(TheArray, sizeof(TSomeArrayElement) * NumElements);
end;

procedure FreeArray(var TheArray : PSomeArray;
NumElements : longint);
begin
FreeMem(TheArray, sizeof(TSomeArrayElement) * NumElements);
end;

procedure ReSizeArray(var TheArray : PSomeArray;
OldNumElements : longint;
NewNumElements : longint);
var
then
ewArray : PSomeArray;
begin
GetMem(then
ewArray, sizeof(TSomeArrayElement) * NewNumElements);
if NewNumElements > OldNumElements then
Move(TheArray^,
then
ewArray^,
OldNumElements * sizeof(TSomeArrayElement)) else
Move(TheArray^,
then
ewArray^,
NewNumElements * sizeof(TSomeArrayElement));
FreeMem(TheArray, sizeof(TSomeArrayElement) * OldNumElements);
TheArray := then
ewArray;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
p : PSomeArray;
i : integer;
begin
{$IFOPT R+}
{$DEFINE CKRANGE}
{$R-}
{$ENDIF}
CreateArray(p, 200);
for i := 0 to 199 do
p^ := i;
ResizeArray(p, 200, 400);
for i := 0 to 399 do
p^ := i;
ResizeArray(p, 400, 50);
for i := 0 to 49 do
p^ := i;
FreeArray(p, 50);
{$IFDEF CKRANGE}
{$UNDEF CKRANGE}
{$R+}
{$ENDIF}
end;

 

先SetLength(N,number);分配空间
然后调用RandomX
 
偶的问题还没有解决啊
大家帮帮忙
55555555555555555555555555555
 
hfghfghfg说的没错,
》 先SetLength(N,number);分配空间
》然后调用RandomX
你可能没明白他的意思, 即SetLength(N, number)应放在调用RandomX过程之前,而不
是在RandomX过程之中来定义, 这完全可以做得到, 因为在调用RandomX的前一步, number值肯定已知
 
多谢大富翁WW,我明白,下面是代码,只需一个Button和10个Edit,但是生成大概5组数后
程序就会死掉。
:)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

procedure RandomX(intFrom,intTo,number:Integer;var N:array of Integer);

implementation

{$R *.dfm}

procedure RandomX(intFrom,intTo,number:Integer;
var N:array of Integer);
var
Temp : Integer;
i,j : Integer;
Ext : Boolean;
//tn: array of integer;
begin
if Number>(intTo-intFrom) then
Raise Exception.Create('无法生成。');
// SetLength(tn,number);
n[0]:=-1;
for i:=1 to Number do
begin
Ext:=False;
repeat
Temp := Random(intTo-intFrom)+intFrom;
//取一个随机数
for j:=0 to i-1 do
if Temp=n[j] then
begin
Ext:=True;
Break;
end;
until not Ext;
n[i-1]:=Temp;

end;
// N:=tn;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Num:array of Integer;
begin
Randomize;
setlength(num,10);
RandomX(200,400,10,Num);
Edit1.Text := IntToStr(Num[1]);
Edit2.Text := IntToStr(Num[2]);
Edit3.Text := IntToStr(Num[3]);
Edit4.Text := IntToStr(Num[4]);
Edit5.Text := IntToStr(Num[5]);
Edit6.Text := IntToStr(Num[6]);
Edit7.Text := IntToStr(Num[7]);
Edit8.Text := IntToStr(Num[8]);
Edit9.Text := IntToStr(Num[9]);
Edit10.Text := IntToStr(Num[0]);
SetLength(Num,0);
end;

end.
 
[:)]问题出在 Ext:=False 应放在repeat 之后
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=542886
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=542886
着重看一下这篇帖子里Beta的这段话:
{你的算法有毛病啊!
总算找到了!
repeat
Temp:=random(5)+a;//范围为5;
特别耗费时间。如果范围扩大,则不会出现这样的情况。如random(500);
for j:=0 to i-1 do
begin
if Temp=N[j] then
begin
Exist:=true;
break;
end;
end;

if (not exist) then
N[i-1]:=Temp;
until not Exist;
看一下,要是有一次重复,那么就死定了!!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
当重复的时候,Exist 为 True,从 for 里面 break 出来,
然后回到 repeat 的第一行,看一看,你现在地 Exist 还是
True 吧!因此,即使 if Temp=N[j] then
不满足,没有给
Exist 再次赋值为 True,但是 Exist 本来就已经是 True
~~~~ ~~~~~~~~~~~~~~~~~
于是又循环………………
修改也很简单,将 Exist:=false;
移到 repeat 里面去
我已经调试通过了,尽管重复的几率很大,但是还是一眨眼就
~~~~~~~~~~~~~~~~
运行完了!
解决了!}
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
nn=array of integer;
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
// label:lab;
implementation
{$R *.dfm}
procedure RandomX(intFrom,intTo,number:Integer;var N:nn);
var
Temp : Integer;
i,j : Integer;
Exist : Boolean;
label lab;
begin
if Number>(intTo-intFrom) then
Raise Exception.Create('无法生成。');
SetLength(N,number);
N[0]:=-1;
for i:=1 to Number do
begin
Exist:=False;
lab: Temp:=Random(intTo-intFrom)+intFrom;
repeat
for j:=0 to i-1 do
begin
if Temp=N[j] then
begin
// Exist:=True;
// Break;
goto lab;
end;
end;
until not Exist;
N[i-1]:=Temp;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
n:nn;
begin
RandomX(2,10,3,n);
form1.Caption:='ok';
memo1.Lines.Add(inttostr(n[0]));
memo1.Lines.Add(inttostr(n[1]));
memo1.Lines.Add(inttostr(n[2]));
end;

end.
 
多谢大家,问题终于解决,呵呵
更该感谢“大富翁WW”,分太少了不够表达谢意,在开一个贴子给“大富翁WW”分!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
731
import
I
I
回复
0
查看
655
import
I
顶部