如何產生不重複的亂數 |
答題得分者是:T.J.B
|
Peter
一般會員 發表:10 回覆:2 積分:2 註冊:2002-06-28 發送簡訊給我 |
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
|
Peter
一般會員 發表:10 回覆:2 積分:2 註冊:2002-06-28 發送簡訊給我 |
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
給你做參考 : unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
var
aa :array[1..5] of integer; //假設你是有5組號碼
bb : array[1..250] of boolean;// 設定此亂數範圍的數字是否被選取
i ,j : byte;
ss : string;
begin
Randomize; //撥亂數種子
for j := 1 to 250 do //將1~250的初始化
begin
bb[j] := false; //設定全部尚未選取過
end; for i := 1 to 5 do
begin
repeat
aa[i] := random(250)+1; //範圍從1到250
until bb[aa[i]] = false; //一直選到沒用過的數字為止
bb[aa[i]] := true; //true代表這一個數字已經用過,false表示還沒用過
end;
ss := '';
for i := 1 to 5 do
begin
ss := ss+IntToStr(aa[i])+',';
end;
ShowMessage(ss);//可觀察此結果 5組號碼都沒重覆
end; end. ps: aa 及 bb陣列宣告可依你的需求做改變
但要注意 數字範圍 跟 型態 的關係 < >< > 回首來時路
也無風雨也無晴~~@.@ 發表人 - T.J.B 於 2002/09/24 14:01:21
------
天行健 君子當自強不息~~@.@ |
anderslee
初階會員 發表:2 回覆:32 積分:26 註冊:2002-06-03 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
引言: 我相信方法只能和以往產生過的亂數一一比較, 如果重覆就再產生一個亂數 pseudo code => generate a random number => compare with list => if exists loop back to step 1 => add the new number on the list => return the new number我有另一個方法,叫做洗牌法 亂數範圍為 0 ~ n-1 時可用,方法如下:引言: 請教各位前輩 要如何才能產生不重複的亂數呢?? 1. 宣告一個 0..n-1 的 int 陣列 2. 初始化陣列的每個元素,讓元素等於下標 (IntArr[i] := i) 3. 跑 n 次迴圈 3.1 取兩個 0..n-1 之間的數 3.2 將陣列中的這兩個元素交換 4. 要拿幾個就從陣列的開頭取幾個保證不重複,速度也穩定 用比較法的缺點是:當要把所有數字不重複的全部取出時,速度會隨著亂數範圍的增大而急速減慢 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |