用随机函数填充数组问题。 ( 积分: 50 )

给分吧。
Function GetNum(Max: Integer): String;
Var
T1: Array Of String;
I, J, L, T3, T5: integer;
T2: Boolean;
T4: String;
begin
SetLength(T1, Max);
For I := 0 To Max - 1do
begin
T1 := IntToStr(I + 1);
end;
Randomize;
T2 := True;
J := 0;
L := 0;
While T2do
begin
T3 := Random(Max * 2);
T3 := T3 Mod Max;
If T3 < Max then
begin
If T1[T3] <> '' then
begin
T4 := T4 + T1[T3];
If J < Max - 1 then
T4 := T4 + ',';
T1[T3] := '';
Inc(J);
end;
end;
Inc(L);
If L > Max * 10 then
T2 := False;
If J > Max then
T2 := False;
end;
Result := T4;
end;
 
是啊,我偷了哈懒应该有randomize,这行代码哈!
 
这个应该是比较标准的选择了:
Const MaxNum = 10;

procedure TForm1.Button1Click(Sender: TObject);
var
i, Last, Temp: integer;
a: array [1..MaxNum] of integer;
begin
Randomize;
for i := 1 to MaxNumdo
a := i;
for Last := MaxNumdo
wnto 2do
//用random 去确定最后一个元素。
begin
//可以保证不重复
i := random(Last) + 1;
if i = Last then
Continue;
//这个几率还是相当小的,可以考虑不用。
Temp := a[Last];
a[Last] := a;
a := temp;
end;
Memo1.Clear;
//输出
for i := 1 to MaxNumdo
Memo1.Lines.Add(Inttostr(a));
end;
 
选择部分也可以按照
来自:初学者1号, 时间:2005-9-10 10:05:56, ID:3199644
的方法,用第二个数组存储,会更快一些。
for Last := MaxNumdo
wnto 1do

begin

i := random(Last) + 1;
b[Last] := a;
a := a[Last];
end;
 
昨天回家实验实验,大家在回来看看,结果如下:
to tianrei 使用你的方法调试,有时会出现22的数,还有重复的数,不知何故,可能是在我写的时候有问题 ??
to chaos518 编后执行CPU使用100%,没有结果,死机,不知何故??
初学者1号,jeffrey_s都是正确的。
其它几位没有试验,程序有些复杂,不容易看。
有空大家都试验看看,找找原因,可能是我做的错误。
 
楼主去查查旧贴吧,我回答过的,是段成熟的代码,完全符合你的要求。
 
晕哦,简单的问题被复杂化,学问啊。
不就是要把10个元素随机排列吗?用的着这么复杂?
从结果和效率上,初学者1号和jeffrey_s才是正解,如果怕还不够乱序,在外层再加一层for,多几次循环就是了。
 
这么麻烦干嘛?用个TList就搞定啦
List := TList.Create;
for I := 1 to 10do
List.Add(Pointer(I));
Randomize;
for I := 10do
wnto 1do
begin
Index := Random(I);
a := Integer(List[Index]);
List.Delete(Index);
end;
List.Free;
 
多人接受答案了。
 
lwcsoft:
不好意思,我今天才看到这个贴已经结了,我看见你说这个算法有问题马上上了机调试,结果是没有任何问题,我把代码附给你:
procedure TForm1.Button1Click(Sender: TObject);
var
i,x,y,temp:integer;
a:array [1..10] of integer;
begin
randomize;
for i:=1 to 10do
a:=i;
for i:=1 to 20do
begin
x:=Trunc(Random(10)+1);
y:=Trunc(Random(10)+1);
temp:=a[x];
a[x]:=a[y] ;
a[y]:=temp;
end;
label1.Caption:='';
for i:=1 to 10do
label1.caption:=label1.caption+inttostr(a)+' ,';
end;
FORM上只放两个控件可以了,一个BUTTON1,一个LABLE1(用来显示)
 
顶部