電子抽獎程式
這是一份Gemini AI專為藥局抽獎活動設計的單一 HTML 網頁程式碼。
它使用純 JavaScript 編寫,完全不需安裝任何軟體,只要將程式碼複製並儲存為 .html 檔案,即可直接在電腦、手機或平板的瀏覽器中開啟使用。為確保絕對的公平性與隨機性,本程式採用了時間戳記(毫秒級)作為隨機種子,並結合國際標準的 Fisher-Yates 洗牌演算法。每次按下抽獎,數字排列都會完全不同。
8月底前完成步驟及作業測試,9月15日在見證人之下,公開抽獎,隨即登入中獎名單。
9月15日當日診所及藥局都有例行診療及調劑領藥工作,人力不足,故採用電子抽獎作業,但一定會做到公開、公平、公正。
<div class="container">
<h2>大獎爭奪戰 🎲 電子抽獎系統</h2>
<div class="input-group">
<label for="startNum">1. 開始數字(最小值)</label>
<input type="number" id="startNum" value="1" placeholder="例如:1">
</div>
<div class="input-group">
<label for="endNum">2. 結束數字(最大值)</label>
<input type="number" id="endNum" value="100" placeholder="例如:100">
</div>
<div class="input-group">
<label for="countNum">3. 需要抽出的整數個數</label>
<input type="number" id="countNum" value="5" placeholder="例如:5">
</div>
<button onclick="generateLottery()">立即產生中獎號碼</button>
<div class="result-box">
<div class="result-title">🎯 中獎號碼排列:</div>
<div id="resultList" class="result-list">(尚未開始抽獎)</div>
<div id="seedInfo" class="seed-info"></div>
</div>
</div>
<script>
// 自訂偽隨機數產生器 (SFC32 演算法),使用時間戳記作為種子
function sfc32(a, b, c, d) {
return function() {
a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0;
var t = (a + b) | 0;
a = b ^ (b >>> 9);
b = (c + (c << 3)) | 0;
c = (c << 21) | (c >>> 11);
d = (d + 1) | 0;
t = (t + d) | 0;
c = (c + t) | 0;
return (t >>> 0) / 4294967296;
}
}
function generateLottery() {
// 1. 讀取輸入值
const start = parseInt(document.getElementById('startNum').value);
const end = parseInt(document.getElementById('endNum').value);
const count = parseInt(document.getElementById('countNum').value);
const resultListDiv = document.getElementById('resultList');
const seedInfoDiv = document.getElementById('seedInfo');
2. 驗證輸入合法性
if (isNaN(start) || isNaN(end) || isNaN(count)) {
alert('請填寫所有輸入欄位!');
return;
}
if (start > end) {
alert('開始數字不能大於結束數字!');
return;
}
const totalNumbers = end - start + 1;
if (count > totalNumbers) {
alert(`錯誤:設定的抽取個數 (${count}) 大於號碼總數 (${totalNumbers})!`);
return;
}
if (count <= 0) {
alert('抽取個數必須大於 0!');
return;
}
// 3. 建立連續數字池
let numberPool = [];
for (let i = start; i <= end; i++) {
numberPool.push(i);
}
// 4. 擷取當前時間(毫秒)作為亂數種子,確保每次執行、每一秒都絕對不同
const timestamp = Date.now();
// 使用時間戳記初始化隨機種子
const rand = sfc32(timestamp, timestamp ^ 0xDEADBEEF, timestamp >> 32, 0);
// 5. Fisher-Yates 洗牌演算法 (結合時間種子)
for (let i = numberPool.length - 1; i > 0; i--) {
// 使用基於時間種子的隨機數
const j = Math.floor(rand() * (i + 1));
// 交換元素
const temp = numberPool[i];
numberPool[i] = numberPool[j];
numberPool[j] = temp;
}
// 6. 取出前 N 個號碼作為中獎結果
const selectedNumbers = numberPool.slice(0, count);
// 7. 渲染到網頁畫面上
resultListDiv.innerHTML = selectedNumbers.join(' 、 ');
// 顯示抽獎當下的時間與種子資訊,以昭公信
const nowTime = new Date(timestamp);
const timeString = nowTime.toLocaleTimeString('zh-TW', { hour12: false }) + '.' + String(nowTime.getMilliseconds()).padStart(3, '0');
seedInfoDiv.innerHTML = `時間種子:${timestamp} (${timeString})`;
}
</script>
</body>
</html>

留言
張貼留言