你可以先单独调试randomize函数,看是不是每次Random都返回2

解决方案 »

  1.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      
      i:integer;
    begin
       adotable1.Open;
      randomize;
       i:=random(adotable1.RecordCount);(是不是要多几次用random,如用的话,如何用)
        //i:=random(adotable1.RecordCount);
     
        //while i>adotable1.RecordCount do
            // i:=i-3;
        adotable1.RecNo:=i;
        adotable1.First;
        adotable1.MoveBy(adotable1.RecNo);  end;你两次运行程序取的值当然也是一样的了。因为种子一样。
    如果你想不一样,可以用当前时间或其它可变的作为种子就可以了。如
      

  2.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      
      i:integer;
    begin
       adotable1.Open;
      randomize;
       i:=random(adotable1.RecordCount);(是不是要多几次用random,如用的话,如何用)
        //i:=random(adotable1.RecordCount);
     
        //while i>adotable1.RecordCount do
            // i:=i-3;
        adotable1.RecNo:=i;
        adotable1.First;
        adotable1.MoveBy(adotable1.RecNo);  end;你两次运行程序取的值当然也是一样的了。因为种子一样。
    如果你想不一样,可以用当前时间或其它可变的作为种子就可以了。如
      

  3.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      
      i:integer;
    begin
       adotable1.Open;
      randomize;
       i:=random(adotable1.RecordCount);(是不是要多几次用random,如用的话,如何用)
        //i:=random(adotable1.RecordCount);
     
        //while i>adotable1.RecordCount do
            // i:=i-3;
        adotable1.RecNo:=i;
        adotable1.First;
        adotable1.MoveBy(adotable1.RecNo);  end;你两次运行程序取的值当然也是一样的了。因为种子一样。
    如果你想不一样,可以用当前时间或其它可变的作为种子就可以了。如
      

  4.   


    帮你UP
    -------------------------------------------
    谢谢关注:http://expert.csdn.net/Expert/TopicView1.asp?id=845638
      

  5.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      
      i:integer;
    begin
       adotable1.Open;
      randomize;
       i:=random(adotable1.RecordCount);(是不是要多几次用random,如用的话,如何用)
        //i:=random(adotable1.RecordCount);
     
        //while i>adotable1.RecordCount do
            // i:=i-3;
        adotable1.RecNo:=i;
        adotable1.First;
        adotable1.MoveBy(adotable1.RecNo);  end;你两次运行程序取的值当然也是一样的了。因为种子一样。
    如果你想不一样,可以用当前时间或其它可变的作为种子就可以了。如
      

  6.   

    ShowMessage(IntToStr(adotable1.RecordCount)); //测试看看它的值是否正确//请测试如下代码
    Randomize;
    adotable1.Open;
    adotable1.First;
    adotable1.RecNo := Random(adotable1.RecordCount);
      
      

  7.   

    ShowMessage(IntToStr(adotable1.RecordCount)); //测试看看它的值是否正确//请测试如下代码
    Randomize;
    adotable1.Open;
    adotable1.First;
    adotable1.RecNo := Random(adotable1.RecordCount);
      
      

  8.   

    你的逻辑有问题,改成:
    var
      
      i:integer;
    begin
       adotable1.Open;
      randomize;
       i:=random(adotable1.RecordCount);(是不是要多几次用random,如用的话,如何用)
        adotable1.First;
        adotable1.MoveBy(i);
    end;
      

  9.   

    当你执行adotable1.first时,adotable1.recno就为1了,
    再执行adotable1.moveby(adotable1.recno),当然只向前移动1了。
      

  10.   

    是要用多次,我以前用过随机函数random(50000),结果常常一样,后来我就多用几次。
    这样用就行了。
    i:=random(adotable1.RecordCount);
    i:=random(adotable1.RecordCount);
    i:=random(adotable1.RecordCount);
    i:=random(adotable1.RecordCount);
      

  11.   

    楼上说得有道理,正是俺想说的。你的想法很正确,randomize没有错,随机数种子在每次onCreat事件中重建,重复的几率很小。你的错误就在于First之后,RecNo已经改变!
      

  12.   

    当你执行adotable1.first时,adotable1.recno=1;
    再执行adotable1.moveby(adotable1.recno),当然只向前移动1了。
    Randomize;
    adotable1.Open;
    adotable1.RecNo := Random(adotable1.RecordCount);
      
      

  13.   

    我忘了另外一个方法
    var
         i,j:integer;
    begin
         i:=random(50000);
         i:=random(50000);
         i:=random(50000);
         i:=random(50000);
         j:=i mod adotable1.RecordCount;//j是最后取得的随机数。
      

  14.   

    建议改成:procedure TForm1.FormCreate(Sender: TObject);
    var  
      i:integer;
    begin
      adotable1.Open;
      randomize;
      i:=random(adotable1.RecordCount-1);
      adotable1.RecNo:=i+1;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    var  
      i:integer;
    begin
      adotable1.Open;
      randomize;
      i:=random(adotable1.RecordCount-1);
      //adotable1.RecNo:=i;
      adotable1.First;
      adotable1.MoveBy(i+1);
    end;