函数为
Type
TIntArray:Array of Integer;function myRandom(Range:integer;AIntArray:TIntArray);
begin
end;要求是生成一个在 Range之间的随机数, 但是这个随机数不能等于AIntArray数组中
的数,要求是要考虑效率问题
Type
TIntArray:Array of Integer;function myRandom(Range:integer;AIntArray:TIntArray);
begin
end;要求是生成一个在 Range之间的随机数, 但是这个随机数不能等于AIntArray数组中
的数,要求是要考虑效率问题
for i:=low(aintarray) to high(aintarray) do
begin
if ss=aIntarray[i] then
ss :=Random(Range);
end;
//返回整型
var
j,I:integer;
begin
Randomize
j:=1;
whiel j=1 do
begin
Result:=Rand(Range);
for i:=0 to High(AIntArray) do
begin
j:=2;
if Result=AIntArray[i] then
begin
j:=1
Break;
end;
end;
end;
end;
var
i : integer;
begin
while true do begin
Result := Random(Range);
for i:=low(aintarray) to high(aintarray) do begin
if Result := aIntarray[i] then
continue;
end;
break;
end;
end;
Index:integer;
Pointer,PointerValue:integer;
Flag:Boolean;
NextRange:integer;
Label StartHere; begin if Range=0 then
begin
Result:=100000;//????????????可能有错误
Exit;
end; NextRange:=0;
Pointer:=Random(Range);
PointerValue:=Pointer; if Length(AIntegerArray)=0 then
begin
Result:=Pointer;
Exit;
end; Flag:=False;
StartHere : //StartHere
for Index:=0 to Length(AIntegerArray)-1 do
begin
if (Pointer=AIntegerArray[Index]) and (Pointer<Range-1) then
begin
if Flag=False then
begin
NextRange:=Pointer;
Pointer:=Pointer+1;
// NextRange:=AIntegerArray[Index];
Flag:=True;
goto Starthere;
end
else
begin
Pointer:=Pointer+1;
goto StartHere; //Goto StartHere;
end;
end
else
if (Pointer=AIntegerArray[Index]) and (Pointer=Range-1) then
begin
if (NextRange=0) and (Flag=True)
then Pointer:=100000
else if Pointer=PointerValue
then Pointer:=zhcRandom(Pointer,AIntegerArray)
else Pointer:=zhcRandom(NextRange,AIntegerArray);
end; end;
Result:=Pointer;
end;
Type
TIntArray:Array of Integer;function myRandom(Range:integer;AIntArray:TIntArray): Real;
var
flag: boolean;
ss: real;
i: integer;
begin
while (true) do
begin
ss :=Random(Range);
for i:=low(aintarray) to high(aintarray) do
begin
if ss<>aIntarray[i] then
flag := true
else
begin
flag := false;
break;
end;
end;
if flag then
break;
end;
Result := ss;
end;
是,当range中的值全部被占用的时候, 返回的特定值
我认为,楼主意思不清,
效率是在分析好需要的基础上完成的,
一楼的写法不管有没有问题,(回朔本身就是效率的一大敌(清华有一老师的书上有说))
这个问题为什么一下子写不出来,
因为不知道,后面的数组的大小,如很小,
可以想像,我们用连产生三次RAD,就应该行了
2,我们用yansea(思宏) 的方法也不错
但数据要是很大,也就是说,
可能产生N次,都在数组里,
那么,我们还在一个劲地产生RAD么,
如,数组里一共有9999个数了,而你就要产生最后一个数了,
你想想,上面的方法,差不多都是一个死循环了吧,也就是说,<100个数排序,双冒泡反之最快
但为什么我们还是用QUICK呢,所以,问题本身不清,
看出它要有很多的数据,而且最后是要把所有产生的RAD都放在数组里,那么,则有两条,
范围一定是要缩的,但要以10%的速度,第二点,数组为什么不排序呢,
如每回都排,那么,查找最快,排序最长
如每隔几个排 ,那么,数组加入一个时,不好
把上面问题分解一下,
1,产生一个RAD数,
2,这个数不在数组内
我们把数分成两组,
一组在数组内,一组在一个序列里
如这样看,我们每回在数组剩下的数里产生RAD,再按序列值取出真值
放入数组里
这样就会和楼主写出差不多的代码来,但楼上的几位写的是
其实就是一个数据库维护与查找的效率问题,
ORACLE,用的是B+树
这个应该是ORACLE的效率当然 不用说了,
那么,我们要研究的就是产生RAM的问题了,
就大的多.还有
如,数组里一共有9999个数了,而你就要产生最后一个数了,
你想想,上面的方法,差不多都是一个死循环了吧,有点搞不懂, 我想应该 有 两万次该查不多了吧!
,所以以后取值得时候就不会取到它
function myRandom(Range:integer;AIntArray:TIntArray):integer;
var ss,i:integer;
bfound :boolean;
begin
bfound := true;
ss :=Random(Range);
Repeat
for i:=low(aintarray) to high(aintarray) do
begin
if ss=aIntarray[i] then
begin
bfound := false;
Break;
end;
end;
until bfound;
Result := ss;
end;
var ss,i:integer;
bfound :boolean;
begin
Repeat
bfound := true;
ss :=Random(Range);
for i:=low(aintarray) to high(aintarray) do
begin
if ss=aIntarray[i] then
begin
bfound := false;
Break;
end;
end;
until bfound;
Result := ss;
end;
http://www.csdn.net/expert/topic/909/909516.xml?temp=.7200891
TIntArray=Array of Integer;function myRandom(Range:integer;AIntArray:TIntArray);
begin
end;
TIntArray:Array of Integer;function myRandom(Range:integer;AIntArray:TIntArray): Real;
var
flag: boolean;
ss: real;
i: integer;
begin
while (true) do
begin
ss :=Random(Range);
for i:=low(aintarray) to high(aintarray) do
begin
if ss<>aIntarray[i] then
flag := true
else
begin
flag := false;
break;
end;
end;
if flag then
break;
end;
Result := ss;
end;
1.把AIntArray排序。
2.把AintArray中Random(Range)可能产生的并且不重复的数
放到临时的Array中,显然也是排好序的.
3.缩小Range的范围.
4.对Result进行处理.function myRandom(Range:integer;AIntArray: TIntArray): Integer;
var
Temp: TIntArray;
i, j: Integer;
begin
if Range < 1 then
begin
Result := -1;
Exit;
end; QSort(AIntArray);//排序,没写出来 SetLength(Temp, Length(AintArray));
j := 0;
if (AintArray[0] < Range) and (AintArray[0] >= 0) then
begin
Temp[j] := AIntArray[0];
Inc(j);
end;
for i := 1 to Length(AintArray) - 1 do
begin
if (AIntArray[i] < Range) and (AIntArray[i] >= 0)
and (AIntArray[i] <> AIntArray[i-1]) then
begin
Temp[j] := AIntArray[i];
Inc(j);
end;
end;
Randomize;
Dec(Range, j);
if Range <= 0 then
begin
Result := -1;
Exit;
end;
Result := Random(Range);
for i := 0 to j-1 do
if Result >= Temp[i] then
Inc(Result);
SetLength(Temp, 0);
end;
for i := 0 to j-1 do
if Result >= Temp[i] then
Inc(Result)
else break;
TIntArray: Array of Integer;function myRandom(Range:integer;AIntArray:TIntArray): integer;
var
i: Integer;
begin
Randomize;
while true do
begin
result := Random(Range);
for i := low(AIntArray) to high(AIntArray) do
begin
if result = AIntArray[i] then
continue;
end;
break;
end;
end;