函数为
Type
  TIntArray:Array of Integer;function myRandom(Range:integer;AIntArray:TIntArray);
begin
end;要求是生成一个在 Range之间的随机数, 但是这个随机数不能等于AIntArray数组中
的数,要求是要考虑效率问题

解决方案 »

  1.   

    ss :=Random(Range);
       for i:=low(aintarray) to high(aintarray) do  
       begin 
         if ss=aIntarray[i] then 
           ss :=Random(Range);        
       end;
      

  2.   

    function myRandom(Range:integer;AIntArray:TIntArray):integer;
                                                  //返回整型 
    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;
      

  3.   

    function myRandom(Range:integer;AIntArray:TIntArray);
    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;
      

  4.   

    To shuszj(想见你) 你的程序考虑得不够全面,是会出错的。
      

  5.   

    这个效率肯定不行, 我的要求就是效率尽可能的高效. 看我的一段函数这个函数有一个问题,就是,产成的各个随机数的概率问题, 对于每个可能的数值来说,其生成的概率并不均匀  Function zhcRandom(Range:integer;AIntegerArray:TIntegerArray):integer;   var
         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;
      

  6.   

    在楼上的基础上改改
    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;
      

  7.   

    Result:=100000;//????????????可能有错误
    是,当range中的值全部被占用的时候, 返回的特定值
      

  8.   

    看了一下,
    我认为,楼主意思不清,
    效率是在分析好需要的基础上完成的,
    一楼的写法不管有没有问题,(回朔本身就是效率的一大敌(清华有一老师的书上有说))
    这个问题为什么一下子写不出来,
    因为不知道,后面的数组的大小,如很小,
    可以想像,我们用连产生三次RAD,就应该行了
    2,我们用yansea(思宏) 的方法也不错
    但数据要是很大,也就是说,
    可能产生N次,都在数组里,
    那么,我们还在一个劲地产生RAD么,
    如,数组里一共有9999个数了,而你就要产生最后一个数了,
    你想想,上面的方法,差不多都是一个死循环了吧,也就是说,<100个数排序,双冒泡反之最快
    但为什么我们还是用QUICK呢,所以,问题本身不清,
      

  9.   

    再看楼主代码,为什么每回都要减小RAD的范围呢,
    看出它要有很多的数据,而且最后是要把所有产生的RAD都放在数组里,那么,则有两条,
    范围一定是要缩的,但要以10%的速度,第二点,数组为什么不排序呢,
    如每回都排,那么,查找最快,排序最长
    如每隔几个排 ,那么,数组加入一个时,不好
    把上面问题分解一下,
    1,产生一个RAD数,
    2,这个数不在数组内
    我们把数分成两组,
    一组在数组内,一组在一个序列里
    如这样看,我们每回在数组剩下的数里产生RAD,再按序列值取出真值
    放入数组里
    这样就会和楼主写出差不多的代码来,但楼上的几位写的是
    其实就是一个数据库维护与查找的效率问题,
    ORACLE,用的是B+树
    这个应该是ORACLE的效率当然 不用说了,
    那么,我们要研究的就是产生RAM的问题了,
      

  10.   

    dearmite(我是笨笨!) , 看样子你是高手, 不过我可是很差的哪个概率的说法, 是我实际测试得来的, 比如  myRandom(10, [4,5,6,7,8] ) 根据我写的那个函数结果为 9的可能性
    就大的多.还有
    如,数组里一共有9999个数了,而你就要产生最后一个数了,
    你想想,上面的方法,差不多都是一个死循环了吧,有点搞不懂, 我想应该 有 两万次该查不多了吧!
      

  11.   

    数组AIntArray 不算很多, 其实应该在 Range以内, 也就是说, 第一次random(range)的值为A那么我第二次 random的时候, 就不能让它的结果等于A这个range的值一般取200以内5 以上
      

  12.   

    意思就是, 每一次random的时候, 把这个结果放到数组里面, 标记已经被占用
    ,所以以后取值得时候就不会取到它
      

  13.   

    没什么好办法,只能这样:
    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;
      

  14.   

    纠正一下:function myRandom(Range:integer;AIntArray:TIntArray):integer;
    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;
      

  15.   

    高手们帮我看看这个问题,我7天了都没解决。 一个人学真不容易。
    http://www.csdn.net/expert/topic/909/909516.xml?temp=.7200891
      

  16.   

    Type
      TIntArray=Array of Integer;function myRandom(Range:integer;AIntArray:TIntArray);
    begin
    end;
      

  17.   

    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;
      

  18.   

    我的方法只用一次Random就行。
       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;
      

  19.   

    把后面的改一下
      for i := 0 to j-1 do
        if Result >= Temp[i] then
          Inc(Result)
        else break;
      

  20.   

    Type
      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;