iT邦幫忙

0

rand數字 判斷後符合條件繼續 不符合就重新執行

想請問各位前輩

最近在想一件事是
我想要rand一個數字出來後
判斷他有沒跟資料庫裡的數字重複
如果沒重複就存進資料庫
如果有重複就在rand到沒重複

但我卡在有重複就重新執行這裡

我用if (){} else
這樣好像就卡住了

不知道怎麼突破這想法,想請前輩們提點一下

看更多先前的討論...收起先前的討論...
總裁 iT邦好手 1 級 ‧ 2015-07-05 23:02:07 檢舉
你知道迴圈嗎??...疑惑
外獅佬 iT邦大師 1 級 ‧ 2015-07-06 10:16:49 檢舉
迴圈?疑惑
是像甜甜圈一樣可以吃的嗎?疑惑疑惑
還是像游泳圈一樣可以拿來玩的??疑惑疑惑疑惑
外獅佬 iT邦大師 1 級 ‧ 2015-07-06 10:18:32 檢舉
反正rand欄位不允許重複,不如...
把rand欄位弄成primary key
然後
取亂數->insert->攔截exception...
全部用個function 包起來
重複時呼叫自己這個function
就會一直執行到沒重複為止

2 個回答

0
weiclin
iT邦高手 5 級 ‧ 2015-07-05 21:43:27

是不太清楚你為啥要這樣弄, 資料量越大重複的機率就會變高
最糟糕的情況你可能要跑很久才能找到一個不重複的數字
所以我給你加了嘗試次數的上限

<pre class="c" name="code">
$attempt = 0;
$max_attempt = 100;
// 嘗試一百次
while (++$attempt <= $max_attempt) {
    $number = rand(0, PHP_INT_MAX);
    // 自己寫 number_exists 去判斷數字是否重複
    if (!number_exists($number)) {
        // 數字沒重複, 做你想做的事

        // 最後跳出迴圈
        break;
    }
}

if ($attempt > $max_attempt) {
    // 一百次都重複了, 怎麼辦?
}
4
slime
iT邦大師 1 級 ‧ 2015-07-06 02:09:01

可以換架構嗎?

先依用途產生一個 SN 表, 例如: 1~10000 .
每次使用時, 從 1~10000 的未使用範圍中, 用亂數取一個, 並將該號碼標為已使用.

當使用率達到 75% 時, 就將 SN 表擴充為 1~20000 .

不能說完全使用亂數, 但至少仍保留一定範圍內讓人無法猜到.

我要發表回答

立即登入回答