想請問各位,
我做了一個小抽獎,
假設我有20個項目提供一天內抽獎
一獎1個 二獎3個 三獎3 四獎3個 五獎10個
我用了$r=rand(1,100)
假設$r=6時,會抽到第五獎
$r=13時 抽到四獎
$r=23時 抽到三獎
$r=37時抽到二獎
$r=69時抽到一獎
抽到獎項時同時我也會更新進去資料庫給個值說明他已經抽過 不能再抽到這個項目
也設定了 全部抽完後 顯示未抽中
但,反過來想的是 要是這天沒送完呢?
要怎樣才能避免沒送完的狀態呢?
要怎樣才能避免沒送完的狀態呢?
如果抽獎次數大於20,仍有機率發生送不完的情況。
這就得看抽獎機制的安排了
當場抽獎,發生機率高;
事後抽獎,用程式去把所有獎項塞完。
這樣的概念 可行嗎
Z=抽獎次數
$r=rand(1,100)
A=1 B=3 C=3 D=3 E=10
A=1 R=69 A=A-1 輸出 A已抽中
B=3 R= 37 .36 .35 B=B-1 輸出二獎抽中 二獎還勝B個
C=3 R= 23 .24 .25 C=C-1 輸出叁獎抽中 三獎還勝C個
D=3 R= 13 .14 .15 D=D-1 輸出四獎抽中 四獎還勝D個
E=10 R= 0 .1 .2.3.4.5.6.7.8.9 e=e-1 輸出五獎抽中 五獎還勝e個
R=其他數字 秀出未中獎 或自行在跑到中獎
Z=Z-1 輸出 1-5 獎 A-Z個
Z=0 查詢 A+B+C+D+E =Y
Z=Z+Y =0跳出迴圈 或可手動停止
你的需求只需要兩行程式。由 rand(1,100) 假設你的樣本群是 100 個人,也就是編號 1~100。
設一個陣列,內容放 1~100。
<pre class="c" name="code">$a = range(1, 100);
把陣列亂數排序。
<pre class="c" name="code">shuffle($a);
$a[0]的號碼就是一獎、$a[1], $a[2], $a[3]的號碼就是二獎、以此類推,從頭開始抓你要給獎的人數。這種方法既是亂數抽獎,也不可能沒送完 (除非獎比人多)。