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

L

lwcsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
有10个元素的数组,要求用随机函数生成1-10之间的数字排满数组,要求没有重复的数字,不是顺序排列。
 
有10个元素的数组,要求用随机函数生成1-10之间的数字排满数组,要求没有重复的数字,不是顺序排列。
 
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;
 
如果你是只有10 个数字的话,那就直接随即出来的数字和已经有的比较就可以了
如果数字多的话,就象我下面这样会比较好,定义2个数组AA[],BB[]
i,j:integer;

i:=0;
while i<10
begin
j:=random(10)+1;
//随即出现1-10
if BB[j]=0 //判断j有没有出现过,BB[j]=0表示j没出现过了
begin

BB[j]:=1;

AA:=j;
Inc(i);
end;
end;
这样AA里的数就是所要求的了
 
to: tianrei
你这样好象不怎么好吧,万一20次下来,每次的x,y都一样,那怎么办:)
 
两种方法都有特点,还有没有其他的方法。
 
To lwcsoft,
QQ 上和您细谈
我的 QQ:82780254
 
基本思想是先给一个1——10的数组送1——10的值
然后随机产生两个数组脚标,把这两个数组的值交换,交换次数多,随机效果就明显了。
我的程序代码交换了20次。
 
to chaos518:20次中是可能有X,Y相同的时候,但肯定不可能每次都相同!你可以把他设置成100,执行效率应该还是很高的!你不会问我100次中,X,Y全部相同怎么办把,呵呵!不可能事件哈!
 
to tianrei
假如数组是个很大的数组,你的这种方法的效率是否有所下降,
 
for i:=0 to 9do
a:=i;
for i:=0 to 9do
begin

s:=random(10-i);
b:=a;//从0..9中选个10数
a:=a[9-i];//踢掉已经选取的数
end;

然后,b中就是你要的数据了。
 
假如现在是一个很大的数组,哪种方法效率会更高一些
 
chaos518:如果是成千上万的话,肯定换算法,但他定了是10个数组。就算是大数组,他多了一步比较判断,这就导致了他的程序反而慢了!实践是最好的裁判,你可以把两种方法试一下,哪个更好用!你的算法有个最大的弱点就是到了只有1,2个数字的时候,随机函数有可能老是命不中,反复的循环!如果是大数组,你的算法是灾难性的,有可能等待命中的时间会很长!
 
你都试一下好了,比较了才知道的,不过有结果了告诉大家一声,嘿嘿
 
不会啊,我试过100万以上的数了,很快的啊
 
chaos518,:我刚才看了哈你的贴子,你连SQL带参数查询都不会??[?]
 
是啊,8月1号才开始学DELPHI和SQL的,怎么,这个都有问题啊
 
function GetArrayResult(vNum: string):string;
var
aArray: Array [0..9] of integer;
bArray: Array [0..9] of integer;
sList: TStringList;
m, n: integer;
//重组数组
procedure ResetArray(i: integer);
var
i1, i2, i3: integer;
begin
aArray:= -1;
i2:=0;
for i1:=0 to 9do
begin
if aArray[i1]<>-1 then
begin
bArray[i2]:= aArray[i1];
inc(i2);
end else
continue;
end;
for i1:=0 to 9do
begin
aArray[i1]:= bArray[i1];
bArray[i1]:= -1;
end;
end;

begin
result:='';
sList:= TStringList.Create;
for m:=0 to 9do
begin
sList.Add(m+1);
end;

//初始化数组
for m:=0 to 9do
begin
aArray[m]:= strtoint(sList.Strings[m]);
bArray[m]:= -1;
end;

//生成随机数
for m:=10do
wnto 1do
begin
n:= random(m);
if result='' then
result:= inttostr(aArray[n])
else
result:= result+'.'+inttostr(aArray[n]);
//重组数组
ResetArray(n);
end;

sList.Free;
end;
 
各位大侠:
我有一个小小的问题想请教:
比如tianrei的程序中有个trunk函数,我怎么查找该函数的意义?
请不吝指教。
 
忘记写了,在任何随机数开始的时候,调用一下randomize,否则你每次的随机数顺序都是一致的。
 
顶部 底部