随机函数? |
尚未結案
|
coldcoffee
一般會員 發表:60 回覆:22 積分:16 註冊:2003-05-23 發送簡訊給我 |
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
|
coldcoffee
一般會員 發表:60 回覆:22 積分:16 註冊:2003-05-23 發送簡訊給我 |
找到了这样一个函数:
===============================[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 發送簡訊給我 |
也許您也能試試用兩個 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 發送簡訊給我 |
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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |