rand 亂數一直重複的問題 |
答題得分者是:ChungLin.Net
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
程式的目的是先做出一個5位數的亂數,再到資料庫找有沒有已重複的值,如果有重複,就再重新找一次
以下是我的code [code cpp] int T_ID = 0; AnsiString XXX; do { randomize(); int a[5]={0}; for(int i=0; i!=5; i) a[i] = (rand()); for (int i=0; i!=5; i) { char c = (a[i] 48); XXX[i 1] = c; } T_ID = XXX.ToInt(); }while( Table1->FindKey(ARRAYOFCONST((T_ID))) ); [/code] 如果間隔1~2秒呼叫這個函式,是正常的 不過再快一點就會卡在這個while迴圈(一直重複),不知道要怎麼解這個問題咧… |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
請試:
static unsigned int seed = 2; do { ..... for(int i=0; i!=5; i) { a[i] = (rand());} .................. }while (.....) 我用想的,自己沒試。所以…
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2010-10-29 21:03:33, 註解 無‧
|
ChungLin.Net
中階會員 發表:2 回覆:33 積分:52 註冊:2006-07-26 發送簡訊給我 |
randomize(); 只需執行一次即可,請把 randomize(); 拿出迴圈外就可正常
另就以所提供的程式碼在 BCB6上執行時,跑到 XXX[i 1]=c 這邊時 會出現錯誤, 就邏輯來說,XXX 並未宣告字串,所以 XXX[?] 取陣列時就會產生錯誤,不知 GrandRURU 兄是用什麼程式編譯執行的 ? ===================引 用 GrandRURU 文 章=================== 程式的目的是先做出一個5位數的亂數,再到資料庫找有沒有已重複的值,如果有重複,就再重新找一次 以下是我的code [code cpp] int T_ID = 0; AnsiString XXX; do { randomize(); int a[5]={0}; for(int i=0; i!=5; i) a[i] = (rand()); for (int i=0; i!=5; i) { char c = (a[i] 48); XXX[i 1] = c; } T_ID = XXX.ToInt(); }while( Table1->FindKey(ARRAYOFCONST((T_ID))) ); [/code] 如果間隔1~2秒呼叫這個函式,是正常的 不過再快一點就會卡在這個while迴圈(一直重複),不知道要怎麼解這個問題咧…
------
無限的想像,無盡的延伸。
編輯記錄
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
謝謝aftcast大和ChungLin.Net大所提供的方法
To : ChungLin.Net大 我的原始code是用stringstream來存放值,因為要減少解答人的理解時間,用ansistring比較能很快表達我的意思。 再來, 在經過小弟的測試後發現,還是一樣,不行……… 不論randomize();是在do前還是do內,都不行 P.S : randomize();初始是依系統時間,所以每次初始的值都會不一樣。但最後rand()的值卻都一樣,真想捏爆它。 不過後來看了static的方式,決定改用另一種方法試試,結果還真的ok耶! 以下是我的Code [code cpp] int T_ID = 0; static int ixx=0; AnsiString XXX="12345"; do { randomize(); int a[5]={0}; for(int i=0; i!=5; i) a[i] = (rand()); for (int i=0; i!=5; i) { char c = (a[i] 48); XXX[i 1] = c; } T_ID = XXX.ToInt(); if (ixx <= 10) ixx; else { ixx = 0; T_ID = T_ID Rand().ToInt(); T_ID = StrToInt(FormatFloat("00000", T_ID)); } }while( Table1->FindKey(ARRAYOFCONST((T_ID))) ); [/code] 反正最大不會超過「32767」(剛好5位數,不會超出資料庫界定的範圍) 就給它去了。 這樣還真的覺得很糟糕啊…… 目前暫時先解決這個問題了,架構問題改天再說 aftcast大,我們鼓勵一下新人吧,分數就先給他囉 ^ ^ ===================引 用 aftcast 文 章=================== 請試: static unsigned int seed = 2; do { ..... for(inti=0;i!=5; i){ a[i]=(rand());} .................. }while (.....) 我用想的,自己沒試。所以…
編輯記錄
GrandRURU 重新編輯於 2010-10-30 11:16:37, 註解 無‧
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
相關的討論和與章還不少,可參考
http://www.programmer-club.com/ShowSameTitleN/c/38415.html 或是 [BCB] 高效率的產生不重複亂數 隨機數- 洗牌演算法 ===================引 用 GrandRURU 文 章=================== 程式的目的是先做出一個5位數的亂數,再到資料庫找有沒有已重複的值,如果有重複,就再重新找一次 以下是我的code [code cpp] int T_ID = 0; AnsiString XXX; do { randomize(); int a[5]={0}; for(int i=0; i!=5; i) a[i] = (rand()); for (int i=0; i!=5; i) { char c = (a[i] 48); XXX[i 1] = c; } T_ID = XXX.ToInt(); }while( Table1->FindKey(ARRAYOFCONST((T_ID))) ); [/code] 如果間隔1~2秒呼叫這個函式,是正常的 不過再快一點就會卡在這個while迴圈(一直重複),不知道要怎麼解這個問題咧… |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
謝謝ddy副站長的回覆
我也有試著採用這兩篇的概念來寫,但主因似乎是SendMessage發送時間太短所導致函式重入的奇怪問題 現在改採now().val取亂數來縮短wndproc內的處理時間,暫時解決這個問題 我覺得之後還是要改一下我這個架構才是 ^ ^||| ===================引 用 ddy 文 章=================== 相關的討論和與章還不少,可參考 http://www.programmer-club.com/ShowSameTitleN/c/38415.html 或是 [BCB] 高效率的產生不重複亂數 隨機數- 洗牌演算法 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |