随机函数速度问题!(12分)

C

cb1997

Unregistered / Unconfirmed
GUEST, unregistred user!
从1000个数字中随机抽去一个,可是如何让这1000个数在最短的时间内都可以循环一次呢?
 
使用数组,抽去的就删除!
 
抽去的话,循环一次后不就没有数据了吗!
那如果第一次循环我没选择,第二次,不就没有数据了吗
 
把每次抽出来的数据放在一个列表里,判断一下就可以了。
 
A数组放1000数字,随机抽一个,就移动B数组里,A都抽完了,数字不就都在B里面了吗??
 
procedure TForm1.Button9Click(Sender: TObject);
var
a:integer;
Temp:integer;
i,j:integer;
M:array[0..999]of Integer;
begin
randomize;
for i:=0 to 999 do //fill the array with 0..999
M:=i;
for i:=0 to 999 do
begin //此算法将被选中的数放到数组头部,然后再剩下的数中进行选取
j:=random(1000-i)+i
//每循环一次范围减1
Temp:=M
//交换M和M[j]
M:=M[j];
M[j]:=Temp;
end;
//Now M[] is Random :)
end;

请参考:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=542886
http://www.delphibbs.com/delphibbs/dispq.asp?lid=898091
 
从理论来分析,如果你想对1000个数在最短时间内进行遍历,那么这个算法就应该是这样:
第一次,产生1~1000间的一随机数,在1000个数中定位,然后将其从1000个数中去除。
第二次,产生1~999间的一随机数,在999个数中定位,然后将其从999个数中去除。
......
第999次,产生1~2间的一随机数,在2个数中定位,然后将其从2个数中去除。
第1000次,可以直接定位该数。

这就是一个循环递归的问题。
 
定义一个二维数组
如a[1000,1000]
第一维放1000个数
第二维放0或1(0为已经挑选过的,1为没有挑选过的)
再写一个二维数组转换成一维数组的函数
在转换过程中根据二维数组中第二维的数值变换一维数组
然后再一维数组随机挑一个数
 
顶部