線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3323
推到 Plurk!
推到 Facebook!

rand 亂數一直重複的問題

答題得分者是:ChungLin.Net
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-10-30 10:01:10 IP:111.249.xxx.xxx 未訂閱
程式的目的是先做出一個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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-10-30 11:02:36 IP:220.135.xxx.xxx 訂閱
請試:

static unsigned int seed = 2;

do
{
.....
for(int i=0; i!=5; i) {
srand (   seed );
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-10-30 17:38:17 IP:112.104.xxx.xxx 訂閱
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迴圈(一直重複),不知道要怎麼解這個問題咧…
------
無限的想像,無盡的延伸。
編輯記錄
ChungLin.Net 重新編輯於 2010-10-30 03:39:06, 註解 無‧
ChungLin.Net 重新編輯於 2010-10-30 03:41:13, 註解 無‧
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-10-30 23:00:29 IP:111.249.xxx.xxx 未訂閱
謝謝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){
srand (   seed );
a[i]=(rand());
}

..................


}while (.....)


我用想的,自己沒試。所以…


編輯記錄
GrandRURU 重新編輯於 2010-10-30 11:16:37, 註解 無‧
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-11-01 15:40:35 IP:122.147.xxx.xxx 訂閱
相關的討論和與章還不少,可參考
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
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-11-01 16:13:41 IP:203.75.xxx.xxx 未訂閱
謝謝ddy副站長的回覆
我也有試著採用這兩篇的概念來寫,但主因似乎是SendMessage發送時間太短所導致函式重入的奇怪問題

現在改採now().val取亂數來縮短wndproc內的處理時間,暫時解決這個問題
我覺得之後還是要改一下我這個架構才是 ^ ^|||

===================引 用 ddy 文 章===================
相關的討論和與章還不少,可參考
http://www.programmer-club.com/ShowSameTitleN/c/38415.html
或是
[BCB] 高效率的產生不重複亂數 隨機數- 洗牌演算法
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-12-23 16:44:16 IP:203.75.xxx.xxx 未訂閱
今天才發現,
主因是TCPServer的Execute事件會無視Randomize
間接導致Random失靈

解決方法只能靠Synchronize來處理了……
系統時間:2017-12-18 7:22:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!