全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:926
推到 Plurk!
推到 Facebook!

随机函数?

尚未結案
coldcoffee
一般會員


發表:60
回覆:22
積分:16
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-13 22:15:53 IP:61.51.xxx.xxx 未訂閱
有没有这样的一个随机函数,可以从0-100产生一个随机数,例如第一次产生的是58,第二次再产生随机数时不包括第一次产生的随机数,也就是58这个数,而是其它的数,如69,第三次再产生随机数时不包括前两次的随机数,这样一直到所有剩下的数都随机产生完。
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-13 22:48:40 IP:211.162.xxx.xxx 未訂閱
Hi,coldcoffee,您好! 站內有相關的討論了,請您看看這篇: class="code"> =============== 人生在勤,不索何获? ===============
------
人生在勤,不索何获?
coldcoffee
一般會員


發表:60
回覆:22
積分:16
註冊:2003-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-14 12:12:30 IP:61.51.xxx.xxx 未訂閱
找到了这样一个函数: ===============================[Code Start]=============================== procedure GenerateRandoms(var arr:array of integer); var ordTable:array of integer; i,j,temp:integer;MaxNumber:integer; begin Randomize; //建立顺序表 SetLength(ordTable,High(arr)-Low(arr) 1); MaxNumber:=100*Length(ordTable); //随机初始化顺序表 for i:=Low(arr) to High(arr) do ordTable[i]:=Random(MaxNumber); //顺序表与目标数组排序,排序后就是随机数组了 for i:=0 to Length(ordTable) do begin for j:=Low(arr) to High(arr)-1 do if ordTable[j]>ordTable[j 1] then begin temp:=ordTable[j 1]; ordTable[j 1]:=ordTable[j]; ordTable[j]:=temp; temp:=arr[j 1]; arr[j 1]:=arr[j]; arr[j]:=temp; end; end; end; ===============================[Code End]=============================== GenerateRandoms函数举例: var arr:array[0..100] of integer;i:integer; begin for i:=0 to 100 do arr[i]:=i; Memo1.Clear ; GenerateRandoms(arr); for i:=0 to 100 do Memo1.Lines.Add(IntToStr(arr[i]));
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-14 22:42:02 IP:220.137.xxx.xxx 未訂閱
也許您也能試試用兩個 TStrings.. 一消一長    
//建立
procedure TForm1.Button4Click(Sender: TObject);
  var i:integer;
begin
  with memo1 do
  begin
    clear;
    for i:=111 to 333 do
      lines.add(inttostr(i));
  end;
  memo2.Clear;
  randomize;
end;
//呼叫
procedure TForm1.Button5Click(Sender: TObject);
  var i:integer;
begin
  with memo1 do
  begin
    if Lines.Count>0 then
    begin
      i:=random(lines.Count);
      memo2.lines.Add(lines.Strings[i]);
      lines.Delete(i);
    end;
  end;
end;
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-14 23:15:18 IP:211.20.xxx.xxx 未訂閱
coldcoffee 你好  
  如果只是要取得任意排列的數據,換個方向思考是否可行?,取自洗牌的觀念,產生0到100 的陣列,然後逐一隨意交換位置的值亦可得到隨機排列的陣列值(0到100都不缺席)
  若用原來的觀念,在非常極端的狀況下,有可能某個數值就是開得很慢,造成時間拉長也不好吧!    Type
  IntegerArray = array of integer ;    procedure TForm1.BitBtn1Click(Sender: TObject);
  procedure GenerateRandoms(var arr:IntegerArray);
  var
    i,j,temp:integer;MaxNumber:integer;
  begin
    RandSeed := Trunc(Time*8640000); // 1/100秒 為種子值,每次洗牌才不會一樣
    Randomize;
    MaxNumber := High(Arr)-Low(Arr) 1 ;
    For i:= Low(Arr) To High(Arr) Do Begin
      j := Random(MaxNumber) Low(Arr); // 隨意位置
      Temp :=Arr[i] ;  // 交換資料
      Arr[i] := Arr[j];
      Arr[j] := Temp ;
    End;
  end;
var
  arr:IntegerArray;
  i:integer;
begin
  SetLength(Arr,101);
  for i:=0 to 100 do
    arr[i]:=i;
  Memo1.Clear ;
  GenerateRandoms(arr);
  for i:=0 to 100 do
  Memo1.Lines.Add(IntToStr(arr[i]));    end;
 
發表人 - chance36 於 2004/06/15 00:29:00
系統時間:2024-05-18 14:31:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!